说我有以下数据:
Client Date Money
31CDAAFE-93BA-4666-AE6D-2253059990BB 2011-08-31 200000000.00
31CDAAFE-93BA-4666-AE6D-2253059990BB 2011-07-31 198000000.00
31CDAAFE-93BA-4666-AE6D-2253059990BB 2011-04-31 108000000.00
有没有一种简单的方法可以找出最新和最新记录的金额(金钱)之间的差异?
因此对于这个数据集,答案是:
31CDAAFE-93BA-4666-AE6D-2253059990BB 2011-08-31 2000000.00
我基本上需要返回第一条记录与客户和日期以及2之间的差异。注意有多个客户,日期和金钱,如果客户只有一个日期,我可以返回金额。
我已经对数据进行了排名,但在我的生活中无法弄清楚如何在一行中得出结果......我错过了一些明显的东西吗?
SELECT
Client,
Date,
Money,
ROW_NUMBER() OVER (PARTITION BY Client ORDER BY Date DESC) AS Sequence
FROM
MyTable
答案 0 :(得分:3)
;WITH aCTE AS
(
SELECT
Client, Date, Money,
ROW_NUMBER() OVER (PARTITION BY Client ORDER BY [Date] DESC) AS rn
FROM
MyTable
)
SELECT
T1.Client, T1.Money - ISNULL(T2.Money, 0)
FROM
aCTE T1
LEFT JOIN
aCTE T2 ON T1.Client = T2.Client AND T2.rn = 2
WHERE
T1.rn = 1
注意:这涵盖了没有“上一行”的地方
答案 1 :(得分:1)
你可以试试这个:
WITH CTE AS
(
SELECT
Client,
Date,
Money,
ROW_NUMBER() OVER (PARTITION BY Client ORDER BY Date DESC) AS Sequence
FROM MyTable
)
SELECT A.Client, A.[Money] - B.[Money] MoneyDifference
FROM (SELECT * FROM CTE WHERE Sequence = 1) A
INNER JOIN (SELECT * FROM CTE WHERE Sequence = 2) B
ON A.Client = B.Client
答案 2 :(得分:1)
你完成了大部分工作。
剩下要做的就是将你的陈述包装成WITH语句JOIN
,并保留Sequence = 1
所有行。
请注意,不会显示只有1条记录的客户端。我认为这是最合乎逻辑的事情。如果我的假设错误,您应该将INNER JOIN
更改为LEFT OUTER JOIN
。
;WITH q AS (
SELECT
Client,
Date,
Money,
ROW_NUMBER() OVER (PARTITION BY Client ORDER BY Date DESC) AS Sequence
FROM
MyTable
)
SELECT q1.Client
, q1.Date
, q1.Money - q2.Money
FROM q q1
INNER JOIN q q2 ON q2.Client = q1.Client
AND q2.Sequence = q1.Sequence + 1
WHERE q1.Sequence = 1
正如您在评论中指出的那样,您应该阅读使用WITH
语句,实质上是示例中的WITH
语句
请注意,在此示例中,没有涉及的递归(通常与WITH
语句相关联)
SELECT q1.Client
, q1.Date
, q1.Money - q2.Money
FROM (
SELECT
Client,
Date,
Money,
ROW_NUMBER() OVER (PARTITION BY Client ORDER BY Date DESC) AS Sequence
FROM
MyTable
) q1
INNER JOIN (
SELECT
Client,
Date,
Money,
ROW_NUMBER() OVER (PARTITION BY Client ORDER BY Date DESC) AS Sequence
FROM
MyTable
) q2 ON q2.Client = q1.Client
AND q2.Sequence = q1.Sequence + 1
WHERE q1.Sequence = 1
答案 3 :(得分:0)
我将其分解为两个嵌入式子查询:一个用于查找具有最大日期的行,另一个用于查找最大日期不等于第一个查询的日期的行,将这些查询连接到1 = 1(因为你从每个中得到一行),然后得到整体查询的差异。