簡體   English   中英

SQL Server:如何選擇同一組的前2條記錄?

[英]SQL Server : how to select top 2 records of the same group?

我正在使用SQL Server2008。我有一個問題,我需要獲取由2列CodePeriod確定的組中的前2條記錄,然后將它們插入到另一個表中。

這是一個示例表:

Code  |  Period  |  Dept  | DeptWorkPartSum
001      2013-11    D1      53
001      2013-11    D2      33
001      2013-11    D3      12
002      2013-11    D2      30
002      2013-11    D4      28
002      2013-11    D5      15
002      2013-12    D2      100

我想擺脫的是:

Code  |  Period  |  Dept  | DeptWorkPartSum
001      2013-11    D1      53
001      2013-11    D2      33
002      2013-11    D2      30
002      2013-11    D4      28
002      2013-12    D2      100

這可能是一個非常簡單的解決方案,但目前無法確定。

一種簡單的方法是使用具有ROW_NUMBER排名功能的CTE

WITH CTE AS
(
    SELECT Code,Period,Dept,DeptWorkPartSum,
           RN = ROW_NUMBER() OVER (PARTITION BY Code,Period, Dept
                                   ORDER BY DeptWorkPartSum)
    FROM dbo.TableName
)
SELECT Code,Period,Dept,DeptWorkPartSum
FROM CTE
WHERE RN <= 2

演示

但是,您期望的結果似乎不正確,因為對於所有這三個代碼, Dept均不同。

也許您不想按Dept分組而是按Dept分組,那么結果是正確的:

WITH CTE AS
(
    SELECT Code,Period,Dept,DeptWorkPartSum,
           RN = ROW_NUMBER() OVER (PARTITION BY Code,Period
                                   ORDER BY Dept, DeptWorkPartSum)
    FROM dbo.TableName
)
SELECT Code,Period,Dept,DeptWorkPartSum
FROM CTE
WHERE RN <= 2

演示

SELECT Code, Period, Dept, DeptWorkPartSum
FROM (
  SELECT Code, Period, Dept, DeptWorkPartSum
    ,ROW_NUMBER ( ) OVER ( PARTITION BY Code, Period, Dept ORDER BY DeptWorkPartSum DESC) r
  FROM table) q
WHERE r <= 2
try this:


with cte as
(
select *,ROW_NUMBER() over (partition by Code,Period,Dept order by Code) as rn from table
)

select Code,Period,Dept,DeptWorkPartSum from cte where rn<=2 

小提琴演示

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM