2014-06-12 136 views
0

可能不是最好的標題,但下面的例子將說明一切:
我有一個結果集,傷愈復出看起來像這樣:我需要得到獲取記錄集

TargetID  CategoryID ListID   Level 
--------  ---------- ------   ---- 
104   8   29    5 
104   8   37    5 
104   8   7    3 
104   8   7    3 

最接近的(最高級別)某個類別的列表。級別可以是任何數字。換句話說,我需要返回一組唯一的TargetID/CategoryID/ListID,但具有最高級別。 所以濾波結果中應包含:

TargetID  CategoryID ListID   Level 
--------  ---------- ------   ---- 
104   8   29    5 
104   8   37    5 
+1

你可以發佈獲取結果集的查詢嗎? –

+0

這是對視圖的選擇。該視圖無法更改,因爲它在其他地方使用 – BlueChameleon

+0

其他3列很明顯,但如果這些值彼此獨立,爲什麼'ListID'的37和29都是? – paqogomez

回答

0

去猜測你的意思是每個ListID內最高水平。如果是這樣的話,那麼這裏是SQL根據級別對行進行排名,然後外部查詢過濾到頂級點擊(在這種情況下是最高級別)。

SELECT TargetID, CategoryID, ListID, Level 
FROM 
    (
    SELECT 
    TargetID, CategoryID, ListID, Level, 
    DENSE_RANK() OVER (PARTITION BY ListID ORDER BY Level DESC) AS LevelRank 
    FROM ... 
) Ranked 
WHERE Ranked.LevelRank = 1 

更多的膽量:

  • PARTITION BY設置爲ListID使得它使我們的排名爲每個ListID(獨立設置例如,如果ListID 14的最高水平是4,我們會保持即使其他一些ListID的最高級別爲5)。如果您希望它是全球最高級別(獨立於ListID),那麼只需刪除「PARTITION BY ListID」片段
  • ORDER BY定義排名順序;在這種情況下,最高級別排名第一。在每個級別有多個TargetID的情況下,這將它們排列爲平局,因此兩者都將被返回。但是,如果您只想爲每個ListID獲取1行,請將「,TargetID」拖入ORDER BY子句中。

這裏是,如果你想在所有的數據的最高水平(例如,5),然後就返回任何行與水平(同樣的事情上面一個查詢的版本,但沒有分區):

SELECT TargetID, CategoryID, ListID, Level 
FROM 
    (
    SELECT 
    TargetID, CategoryID, ListID, Level, 
    DENSE_RANK() OVER (ORDER BY Level DESC) AS LevelRank 
    FROM ... 
) Ranked 
WHERE Ranked.LevelRank = 1 
0

看看這個我創建的sqlFiddle。在小提琴中有兩個單獨的查詢可能會給你你所要求的。

http://sqlfiddle.com/#!2/4e8680/6/0

select * from test group by TargetId, CategoryId, ListId HAVING LEVEL = MAX(LEVEL); 

這第一個查詢將返回的行,每個目標ID /類別編號/ ListId組這對於該分組的最高水平。

SELECT * from test group by TargetId, CategoryId, ListId HAVING LEVEL = (SELECT MAX(LEVEL) FROM test); 

該第二查詢將返回目標ID /類別ID/ListId基團,其中的電平等於所述表內的最大電平。