【问题标题】:Date Difference with multiple columns in days returns negative number以天为单位的多列日期差异返回负数
【发布时间】:2017-06-19 06:50:03
【问题描述】:

我创建了一个视图,我想以天数显示交易日期的增量。 这是我的表+ SQL语句的一些行:

SELECT
  FirstAppearenceDate 
 ,TranDate
 ,CountryName
 ,AvgTran
 ,RunningTotal
 ,ISNULL(RunningTotal - LAG(RunningTotal, 1) 
  OVER (PARTITION BY CountryName ORDER BY CountryName, TranDate),0) AS MoneyDelta

 ,ISNULL(DATEDIFF(day,LAG(CONVERT(DATETIME, TranDate, 103), 1) OVER 
  (ORDER BY CountryName, TranDate),
  CONVERT(DATETIME, TranDate, 103)),0) AS DaysDelta

 FROM LTV_Preprocessing_2
 ORDER BY CountryName, TranDate

结果是:

[前 30 行]:

FirstAppearenceDate| TranDate| CountryName| AvgTran| RunningTotal| MoneyDelta   | DaysDelta
20150510    20150510    Afghanistan 50.0000000000   50.0000000000   0.0000000000    0
20150510    20150514    Afghanistan 22.0000000000   72.0000000000   22.0000000000   4
20150510    20150603    Afghanistan 40.0000000000   112.0000000000  40.0000000000   20
20150609    20150609    Afghanistan 25.0000000000   137.0000000000  25.0000000000   6
20150718    20150718    Afghanistan 27.5500000000   164.5500000000  27.5500000000   39
20150718    20150727    Afghanistan 135.6500000000  300.2000000000  135.6500000000  9
20151026    20151026    Afghanistan 10.0000000000   310.2000000000  10.0000000000   91
20151214    20151214    Afghanistan 20.0000000000   330.2000000000  20.0000000000   49
20150510    20160102    Afghanistan 10.0000000000   340.2000000000  10.0000000000   19
20150718    20160122    Afghanistan 18.5000000000   358.7000000000  18.5000000000   20
20150510    20160616    Afghanistan 47.0000000000   405.7000000000  47.0000000000   146
20140806    20140806    Aland Islands   10.0000000000   10.0000000000   0.0000000000    -680
20140808    20140808    Aland Islands   20.0000000000   30.0000000000   20.0000000000   2
20140816    20140816    Aland Islands   27.7100000000   57.7100000000   27.7100000000   8
20140806    20140819    Aland Islands   10.0000000000   67.7100000000   10.0000000000   3
20140820    20140820    Aland Islands   90.3300000000   158.0400000000  90.3300000000   1
20140820    20140823    Aland Islands   15.0800000000   173.1200000000  15.0800000000   3
20140826    20140826    Aland Islands   37.9000000000   211.0200000000  37.9000000000   3
20140912    20140912    Aland Islands   3.0800000000    214.1000000000  3.0800000000    17
20140919    20140919    Aland Islands   20.0000000000   234.1000000000  20.0000000000   7
20140820    20140820    Albania 79.0400000000   79.0400000000   0.0000000000    -30
20140821    20140821    Albania 22.0000000000   101.0400000000  22.0000000000   1
20140821    20140822    Albania 20.0000000000   121.0400000000  20.0000000000   1
20140821    20140824    Albania 50.0000000000   171.0400000000  50.0000000000   2
20140821    20140827    Albania 40.0000000000   211.0400000000  40.0000000000   3
20140821    20140828    Albania 48.0000000000   259.0400000000  48.0000000000   1
20140831    20140831    Albania 20.0000000000   279.0400000000  20.0000000000   3
20140821    20140901    Albania 80.0000000000   359.0400000000  80.0000000000   1
20140821    20140902    Albania 119.0000000000  478.0400000000  119.0000000000  1
20140821    20140910    Albania 30.0000000000   508.0400000000  30.0000000000   8

看看负面因素,我希望我的天数 delta 的行为与货币 delta 完全一样 - 对于每个以 0 开头的国家/地区。在这里,您可以在 Day Delta 列中看到阿富汗结束和奥兰群岛开始之间的差异.

提前致谢!

【问题讨论】:

  • eliminate是什么意思?,你想把负数数据转换成正数数据吗?如果是,请使用 ABS 函数。
  • 我希望这个窗口函数能够像我的货币增量一样“理解”,对于每个国家,它应该在天数增量列中从零开始。它在第一个国家/地区队列中确实有效,但之后在一个国家/地区的结束和下一个国家/地区的第一次转换日期之间确实存在差异。

标签: sql sql-server date


【解决方案1】:

为 daysdelta 包含 PARTITION BY CountryName 应该会得到所需的结果

   SELECT
      FirstAppearenceDate 
     ,TranDate
     ,CountryName
     ,AvgTran
     ,RunningTotal
     ,ISNULL(RunningTotal - LAG(RunningTotal, 1) 
      OVER (PARTITION BY CountryName ORDER BY CountryName, TranDate),0) AS MoneyDelta


 ,ISNULL(DATEDIFF(day,LAG(CONVERT(DATETIME, TranDate, 103), 1) OVER 
  (PARTITION BY CountryName  ORDER BY CountryName, TranDate),
  CONVERT(DATETIME, TranDate, 103)),0) AS DaysDelta

 FROM LTV_Preprocessing_2
 ORDER BY CountryName, TranDate

【讨论】:

  • 但由于某种原因,我得到了每个 tran date 的运行总数的重复项 - 其中钱 delta = 0。
猜你喜欢
  • 2019-02-15
  • 1970-01-01
  • 2011-04-19
  • 2015-12-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-13
  • 1970-01-01
相关资源
最近更新 更多