Sql-Server

如何選擇不同的 TOP 但按 列分組

  • March 10, 2016

我有一個 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 ;

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