如何从两行进行计算

时间:2015-06-29 20:40:42

标签: sql date-arithmetic

我最近开始学习SQL,想知道是否可以进行如下计算。

基本上我的表看起来像这样:

UILabel

我想创建一个这样的表:

id    Date           Fill_nbr     
 1   01/01/2015       30      
 1   02/05/2015       30      
 1   03/02/2015       30      
 1   07/01/2015       30      
 1   07/26/2015       30      
 2   03/01/2015       30      
 ....

“Date_last”列的规则是Date_last = Date + fill_nbr,很容易获得。

对我来说困难的部分是“差距”部分。规则是:

  • Gap ='Date' - “Date_last”的最后一条记录。   例如,第二行的间隙计算为Gap = 02/05 / 2015-   2015年1月30日;
  • 每个人的第一条记录或当计算的差距<0;
  • 时,差距= 0

“First”栏目的规则:

  • 第一个= 1表示每个人的第一个记录,或者当间隙> 60时。
  • 否则,First = 0;

2 个答案:

答案 0 :(得分:2)

看起来这个问题已被抛弃,因为重要的细节仍然缺失......认为至少找到解决方案会很有趣。以下解决方案适用于SQL Server 2012或更高版本,因为它使用LAG

SELECT
  id,
  [Date],
  Fill_nbr,
  (CASE WHEN LAG (DATEADD(DD, Fill_nbr - 1, [Date]), 1, NULL) OVER (
    PARTITION BY id ORDER BY [Date]) > [Date] THEN 0 ELSE
      COALESCE(DATEDIFF(DD, LAG (DATEADD(DD, Fill_nbr - 1, [Date]), 1, NULL) OVER (
      PARTITION BY id ORDER BY [Date]), [Date]) - 1, 0) END) AS Gap,
  DATEADD(DD, Fill_nbr - 1, [Date]) AS Date_last,
  CASE WHEN DATEPART(DD, [Date]) = 1 THEN 1 ELSE 0 END AS [First]
FROM Records

SQL小提琴:http://sqlfiddle.com/#!6/a9b68/8

答案 1 :(得分:0)

谢谢,杰森!我发现LAG或LEAD函数可以解决这个问题。所以这是我的解决方案,与您的解决方案类似。再次感谢您的投入!

select
   id,
   date,
   fill_nbr,
   date + fill_nbr - 1 AS date_last,
   LAG(date_last) OVER (PARTITION BY id OREDER by id, date) LagV,
   date - LagV - 1 as gap,
   ROW_NUMBER() OVER(PARTITION BY id IRDER BY id, date) AS rk,
   CASE
       WHEN (gap>30 or rk=1) then '1'
       ELSE '0'
   END AS first 
FROM table;