Sql server SQL Server-获取前n行中的第一、第二和第三大值

Sql server SQL Server-获取前n行中的第一、第二和第三大值,sql-server,Sql Server,如何编写一个查询,为(W,X,Y,Z)的每个组合获取最后N行中的第一、第二、第三大值 我想要这样的东西(在本例中N=4): 提前感谢您提供的任何帮助您可以使用以下查询: SELECT [W_ID], [X_ID], [Y_ID], [Z_ID], [Yr], [Mnth], [Amount], [1] AS Max1, [2] AS Max2, [3] AS Max3 FROM ( SELECT [W_ID], [X_ID], [Y_ID], [Z_ID], [Yr], [Mnt

如何编写一个查询,为(W,X,Y,Z)的每个组合获取最后N行中的第一、第二、第三大值

我想要这样的东西(在本例中N=4):


提前感谢您提供的任何帮助

您可以使用以下查询:

SELECT [W_ID], [X_ID], [Y_ID], [Z_ID], [Yr], [Mnth], [Amount], 
       [1] AS Max1, [2] AS Max2, [3] AS Max3
FROM (
SELECT [W_ID], [X_ID], [Y_ID], [Z_ID], [Yr], [Mnth], [Amount], 
       s.v,
       ROW_NUMBER() OVER (PARTITION BY [W_ID], [X_ID], [Y_ID], [Z_ID], [Yr], [Mnth]
                          ORDER BY CASE WHEN s.v IS NULL THEN 1 ELSE 0 END, s.v DESC) AS rn 
FROM (
  SELECT [W_ID], [X_ID], [Y_ID], [Z_ID], [Yr], [Mnth], [Amount], 
         LAG([Amount]) OVER (PARTITION BY [W_ID], [X_ID], [Y_ID], [Z_ID]
                             ORDER BY [Yr], [Mnth]) AS prev1,
         LAG([Amount], 2) OVER (PARTITION BY [W_ID], [X_ID], [Y_ID], [Z_ID]
                                ORDER BY [Yr], [Mnth]) AS prev2,
         LAG([Amount], 3) OVER (PARTITION BY [W_ID], [X_ID], [Y_ID], [Z_ID]
                                ORDER BY [Yr], [Mnth]) AS prev3
  FROM mytable) AS t
CROSS APPLY (
     SELECT v
     FROM (VALUES([Amount]), (t.prev1), (t.prev2), (t.prev3)) AS x(v)) AS s(v) ) AS u
PIVOT (
   MAX(v) FOR rn IN ([1], [2], [3])) AS pvt
ORDER BY [Yr], [Mnth]
上述查询使用SQL Server 2012提供的窗口函数


尝试将MAX与GROUP BY结合起来……将您的问题分为两个部分-如何获取最新的前3项,以及如何水平排列它们。对于第一个,使用
行编号
,对于第二个
。您还需要查看第一部分的自联接。您希望从这个示例数据中得到什么样的结果?
SELECT [W_ID], [X_ID], [Y_ID], [Z_ID], [Yr], [Mnth], [Amount], 
       [1] AS Max1, [2] AS Max2, [3] AS Max3
FROM (
SELECT [W_ID], [X_ID], [Y_ID], [Z_ID], [Yr], [Mnth], [Amount], 
       s.v,
       ROW_NUMBER() OVER (PARTITION BY [W_ID], [X_ID], [Y_ID], [Z_ID], [Yr], [Mnth]
                          ORDER BY CASE WHEN s.v IS NULL THEN 1 ELSE 0 END, s.v DESC) AS rn 
FROM (
  SELECT [W_ID], [X_ID], [Y_ID], [Z_ID], [Yr], [Mnth], [Amount], 
         LAG([Amount]) OVER (PARTITION BY [W_ID], [X_ID], [Y_ID], [Z_ID]
                             ORDER BY [Yr], [Mnth]) AS prev1,
         LAG([Amount], 2) OVER (PARTITION BY [W_ID], [X_ID], [Y_ID], [Z_ID]
                                ORDER BY [Yr], [Mnth]) AS prev2,
         LAG([Amount], 3) OVER (PARTITION BY [W_ID], [X_ID], [Y_ID], [Z_ID]
                                ORDER BY [Yr], [Mnth]) AS prev3
  FROM mytable) AS t
CROSS APPLY (
     SELECT v
     FROM (VALUES([Amount]), (t.prev1), (t.prev2), (t.prev3)) AS x(v)) AS s(v) ) AS u
PIVOT (
   MAX(v) FOR rn IN ([1], [2], [3])) AS pvt
ORDER BY [Yr], [Mnth]