2012-08-23 66 views
1

會是怎樣的最有效的方式,可以使用連接在DB2表計算模式..計算模式 - 「最高頻率行」 DB2

我想獲得最頻(計數)值給定日期的給定列(ID - 連接表的候選鍵)。

這個想法是從表中獲得最常見的(值),對於某些賬戶(對於相同的ID和日期)具有不同的(值)。我們需要使其在另一個表格中獨一無二。

回答

1

您可以使用通用表表達式[CTE's](由WITH指示)將邏輯分解爲邏輯步驟。首先我們將構建彙總行,然後我們將爲每個組內的行分配一個排名,然後挑選出記錄數最多的行。

比方說,我們想知道每個項目的哪種口味在每個日期銷售最頻繁(也許假設記錄是第一個量)。

WITH s as 
( 
    SELECT itemID, saleDate, flavor, count(*) as tally 
    FROM sales 
    GROUP BY itemID, saleDate, flavor 
), r as 
( 
    SELECT itemID, saleDate, flavor, tally, 
     RANK() OVER (PARTITION BY itemID, saleDate ORDER BY tally desc) as pri 
    FROM s 
) 
SELECT itemID, saleDate, flavor, tally 
    FROM r 
    WHERE pri = 1 

這裏的名稱「s」和「r」是指來自它們各自CTE的結果集。這些名稱可以用來表示語句另一部分中的表格。

pri列將在itemID和saleDate窗口內的第一部分「s」的彙總行上具有TANK值()。 Tally正在下降,因爲我們首先需要最大值,這會得到1的RANK()。然後在主SELECT中,我們只需選擇那些在其分區中第一個的摘要記錄。

通過使用RANK()或DENSE_RANK(),我們可以得到多個口味的itemID,saleDate,如果他們並列第一名。這可以通過用ROW_NUMBER()替換RANK()來消除,但是它會隨意選取其中一個並列的風格作爲勝利者,這可能不是正確答案。

如果我們在表格中有一個銷售數量列,我們可以用SUM(salesqty)替換COUNT(*),並查找出售最多單位的數量。

+0

嘿,謝謝你的回覆,這種解決了問題。是否有辦法打破領帶?如果在等級1中有兩排? – user1521554

+0

謝謝..打開它的工作..查看結果的平均值.. – user1521554

+1

打破領帶可能取決於你的具體情況。如果你能描述你的場景,我*可能會有一些想法。我爲上面的答案彌補的場景有些蹩腳:o) – WarrenT