Sql-Server

按隱式組求和

  • October 2, 2017

我確定我錯過了一個明顯的解決方案,但我試圖總結由顯式組號和隱式排序定義的組的值。我確信這並沒有讓這更清楚,所以假設我有這個範例源表:

GroupID     Value
----------- -----------
1           5
1           5
1           3
2           4
2           1
1           4
2           3
2           5
2           2
1           1

我想要一個為我提供以下結果的查詢:

GroupID     Values
----------- -----------
1           13
2           5
1           4
2           10
1           1

隱含的排序是我還沒有找到解決方法的挑戰……但是。任何幫助,將不勝感激。

我希望我可以使用類似於以下內容的查詢來創建確定性的行排序:

SELECT    * 
       , ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) AS RowNum  
FROM Table WITH(TABLOCK)
OPTION (MAXDOP 1)

我希望這會強制執行分配順序掃描,然後給我一個確定的行順序。

可悲的是,我堅持使用數據。我在這裡沒有其他指標,例如日期等,可以提供任何固定順序。我希望上面概述的技巧就足夠了,但我並不完全確定它會。

**編輯:**只是為了結束這個問題,因為我知道我為什麼要問這個問題,我有一系列按月/年命名的堆表,其中包含業務想要總結的行項目數量按天(它們與我的問題中的隱含組相關)。因為有效地執行此操作看起來不可行,所以我們已確定在月(例如表)級別進行聚合,因此這篇文章幫助我證明了對業務需求的更改是合理的。感謝大家的投入!

您提到的“隱式”組似乎基於行順序。與電子表格或文本文件不同,關係表在邏輯上是一組無序的行,無論它是儲存為堆還是具有聚集索引。除非您有另一個列來促進分組,否則不可能編寫查詢來提供所需的結果。

我希望我可以使用類似於以下內容的查詢來創建確定性的行排序:

SELECT      * 
        , ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) AS RowNum  
FROM Table WITH(TABLOCK)
OPTION (MAXDOP 1)

很抱歉成為壞消息的承擔者,但按文字排序並不能保證確定性排序(即使確實如此,你也需要一個ORDER BY子句)。如果它似乎這樣做,那隻是偶然。不過,任何增量列都可以。

我希望這會強制執行分配順序掃描,然後給我一個確定的行順序。

分配順序掃描並不比任何其他實現更具確定性;您只是(不安全地)依賴於觀察到的不同行為。

引用自:https://dba.stackexchange.com/questions/187311