【问题标题】:Difference between values in consecutive rows for unique ID's唯一 ID 的连续行中的值之间的差异
【发布时间】:2014-10-22 19:35:00
【问题描述】:

SQL Server 2008 R2。

我需要根据一个共同的、唯一的 ID 找出连续行之间的差异。

Data:

AccountNumber   ValueDate     CustomerName        Amount           Difference

     1           06/01/2014   Customer Name 1   -3436.184178    
     2           06/03/2014   Customer Name 2   -154.5               -51.5
     2           06/15/2014   Customer Name 2   -103    
     3           06/02/2014   Customer Name 3   -45289.44   
     4           06/20/2014   Customer Name 4   -4907.52             -1116.43
     4           06/25/2014   Customer Name 4   -3791.09             -3791.09
     4           06/30/2014   Customer Name 4   -3302.19    

差异列是我想要生成的。 只有在以下情况下,我才需要找到连续行之间的差异:

一个特定的 AccountNumber 有超过 1 行。


我设法删除了具有 1 个值/AccountNumber 的行 [在这种情况下为第 1 行和第 4 行]

我仍然需要找到与 [row - row + 1] 的区别 我在 Stack Overflow 上看到了几个答案,但它们似乎不适用于这种情况。

【问题讨论】:

  • 您需要指定“连续行”的含义。 SQL Server 是如何知道 -154.5 在 -103 之前出现的? (此外,如果 AccountNumber 可以在两行中具有相同的值,则它不是唯一的。)
  • 表代表无序集。因此,没有“连续行”之类的东西,除非您明确有一个带有排序的列——通常是一个 id 或创建日期。您的数据没有这样的列,因此它没有“连续行”。
  • 已编辑以包含 ValueDate 作为连续性的参考点[不确定这是否是一个词]

标签: sql sql-server data-manipulation


【解决方案1】:

您可以使用ROW_NUMBER() 函数来做到这一点:

;with cte AS (SELECT *,ROW_NUMBER() OVER(PARTITION BY AccountNumber ORDER BY ValueDate) AS RN 
              FROM YourTable)
SELECT a.*,a.Amount - b.Amount AS Diff
FROM cte a
LEFT JOIN cte b
  ON a.AccountNumber = b.AccountNumber
  AND a.RN = b.RN -1

ROW_NUMBER() 函数为每一行分配一个数字。 PARTITION BY 是可选的,但用于为组中的每个值重新编号,即:如果您 PARTITION BY AccountNumber 则对于每个唯一的 AccountNumber 值,编号将从 1 开始。当然使用 ORDER BY定义编号方式,在 ROW_NUMBER() 函数中是必需的。

在 cte 中使用后,您可以使用 ROW_NUMBER() 进行自连接,以将连接偏移 1 条记录,从而允许在行之间进行比较。

在 SQL Server 2012 中,LEAD()LAG() 函数允许更简单的跨行比较。

【讨论】:

  • 完美。我换了???使用 Aaron 和 Gordon 建议的 ValueDate,我有我需要的数据。
猜你喜欢
  • 1970-01-01
  • 2012-04-17
  • 2023-03-19
  • 1970-01-01
  • 2021-08-15
  • 1970-01-01
  • 1970-01-01
  • 2012-04-23
  • 1970-01-01
相关资源
最近更新 更多