如何找到2个最新日期的2个值的差异

时间:2011-09-22 13:05:11

标签: sql sql-server

说我有以下数据:

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

4 个答案:

答案 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

;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语句

  • 缩短陈述
  • 使其更具可读性
  • 使其更易于维护。

请注意,在此示例中,没有涉及的递归(通常与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(因为你从每个中得到一行),然后得到整体查询的差异。