Sql-Server
如何選擇不同的 TOP 但按 列分組
我有一個 500 行的結果集,但這是 100 張發票。我只需要最後一張發票中的前 10 個。
我發現了類似的東西:如何從每個類別中選擇前 10 條記錄
樣本數據:
InvNr | DetailLine 111 | 1 111 | 2 112 | 1 112 | 2 112 | 3 113 | 1 113 | 2 114 | 1 115 | 1 ... | ...
我希望得到的是例如:
SELECT DISTINCT TOP 2 InvNr, DetailLine FROM tbl_Invoice
有了這個結果:
InvNr | DetailLine 111 | 1 111 | 2 112 | 1 112 | 2 112 | 3
更新:
所以我需要他們創建的最後 10 張(或上例中的前 2 張)發票,但每張發票都可以有“x”數量的明細行,我想要結果中的所有明細行(最後 10 個) .
SELECT InvNr, DetailLine FROM tbl_Invoice where InvNr in (select distinct top (2) InvNr from tbl_Invoice order by InvNr);
編輯以反映實際被問到的內容。
下面就從最高的兩個給大家
InvNr
DENSERANK InvNr DetailLine 1 115 1 1 115 2 1 115 3 1 115 4 2 114 1 2 114 2 2 114 3 2 114 4
創建範例表的程式碼:
IF OBJECT_ID('tempdb..#Invoice', 'U') IS NOT NULL DROP TABLE #Invoice ; CREATE TABLE #Invoice ( InvNr INT NOT NULL ,DetailLine TINYINT NOT NULL ); INSERT INTO #Invoice ( InvNr, DetailLine ) VALUES (111,1), (111,2), (111,3), (111,4), (111,5), (111,6), (112,1), (112,2), (112,3), (113,1), (113,2), (113,3), (113,4), (114,1), (114,2), (114,3), (114,4), (115,1), (115,2), (115,3), (115,4) ;
實際查詢:
WITH CTERowNumber AS ( SELECT DENSE_RANK() OVER (ORDER BY InvNr DESC) AS DENSERANK ,InvNr ,DetailLine FROM #Invoice ) SELECT c.DENSERANK ,c.InvNr ,c.DetailLine FROM CTERowNumber c WHERE c.DENSERANK <= 2 ;