Sql server SQL Server-获取前n行中的第一、第二和第三大值
如何编写一个查询,为(W,X,Y,Z)的每个组合获取最后N行中的第一、第二、第三大值 我想要这样的东西(在本例中N=4):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
提前感谢您提供的任何帮助您可以使用以下查询:
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]