【问题标题】:SQL calculate intermediate daysSQL计算中间天数
【发布时间】:2019-01-07 18:32:23
【问题描述】:

假设我有下表,我希望提取每个积极和消极运动之间的天数。 这样,对于每个“id”,我必须计算每对日期之间的中间天数以及负移动相对于正移动的比例,en SQL Teradata。

id   date  money
----------------
1    1-1   10
1    3-1   -5
1    9-1    8
1   10-1   -2
2    3-1   10
2    9-1  -10
2   15-1   20
2   19-1   -15


id  days_in prop
-----------------
1     2     0.5
1     1     0.25
2     6     1
2     4     0.75

【问题讨论】:

  • 您可以进行自我加入并检查差异。没有得到你所需要的。您可能需要以更好的方式解释问题/输出。将名称(表 A 和 B)添加到您问题中的数据中。
  • 日期列使用什么列数据类型?上面看起来可能是一个字符串,但它真的是一个真正的日期时间吗?
  • 是的,这将是一个真正的日期时间。
  • 如果有多个连续的行有正值或负值怎么办?如果有两行日期相同怎么办?

标签: sql teradata between days


【解决方案1】:

你想要这样的东西:

 select A.id, B.date - A.date as "days_in", (B.money - A.money)  / (b.date - A.date) 
 as "prop"
 from
 (
    select X.id, X.date, min(NextDate.date) as "MinNextDate", X.money
    from [yourTable] X, [yourtable] NextDate
    where
    NextDate.date > X.date
    and NextDate.id = X.id
 ) A,
[YourTable] B
where
   A.id = B.id
   and B.date = A.MinNextDate

我认为 teradata 以整数格式返回日期差异作为天数。如果是 dateTime,您可能需要在减去之前将 datetime 值大小写为日期。

【讨论】:

  • 派生表中缺少 GROUP BY。并且根据每个 id 的行数,由于非等连接,这可能需要大量 CPU。
【解决方案2】:

如何以稍微不同的方式使用自联接,但它仍会产生额外的行,因为联接将针对每一行完成..您可以根据您的条件进一步限制它

select a.id, (b.date-a.date) as days_in,
abs(b.money)/a.money as prop
from <table> a
inner join <table> b
on a.id=b.id
and a.date<>b.date
where (b.date-a.date)>0 and (abs(b.money)/a.money)>0
and (a.money>0 and b.money<=-1)

【讨论】:

    【解决方案3】:

    要获取之前的正值,您可以使用last_value

    SELECT id
      ,datecol
      -- ratio between current negative and previous positive money
      ,Abs(Cast(money AS NUMBER)) /
       Last_Value(CASE WHEN money > 0 THEN money end IGNORE NULLS)
       Over (PARTITION BY id
             ORDER BY datecol)
      -- difference between current and previous date
      -- might need a cast to date or interval result if the datecol is a Timestamp
      ,datecol-
       Last_Value(CASE WHEN money > 0 THEN DATE_ end IGNORE NULLS)
       Over (PARTITION BY id
             ORDER BY datecol)
    FROM vt AS t
    -- return only rows with negative money
    QUALIFY money < 0
    

    当然,这假设总是存在具有正值和负值的交替行。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-07-08
      • 2021-06-22
      • 2017-06-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多