【问题标题】:days between 2 dates dependent on ID2 个日期之间的天数取决于 ID
【发布时间】:2021-01-13 13:47:50
【问题描述】:

我有 ID 和订单日期列;我想要做的是为每个 ID 显示下一个订单日期和当前日期之间的差异。

表格

ID Order Date
1 01/12/2020
2 15/09/2020
2 01/10/2020
3 31/12/2020
4 01/10/2020
4 03/10/2020
4 01/12/2020
5 31/01/2020

我期待什么:

ID Order Date Days between
1 01/12/2020 n/a
2 15/09/2020 77 days
2 01/10/2020 n/a
3 31/12/2020 n/a
4 01/10/2020 2 days
4 03/10/2020 59 days
4 01/12/2020 n/a
5 31/01/2020 0

欢迎大家帮忙...我对 SQL 不熟悉,所以只有基本的了解

【问题讨论】:

标签: sql between days


【解决方案1】:

首先,在 SQL 中,您应该只有一个包含天数的列——一个数字。不要将值转换为字符串。你所谓的'N/A' 应该是NULL 值。

要做你想做的事,请使用lag()。是这样的:

select t.*,
       (order_date -
        lag(order_date) over (partition by id order by order_date)
       ) as date_diff
from t;

请注意,并非所有数据库都支持 - 日期。日期操作的确切语法通常因数据库而异。

【讨论】:

    【解决方案2】:

    77 之间的天数似乎是错误的。请参阅下面的结果。这与上述解决方案相同,仅使用 datediff() 代替。

    create table T (ID int, OrderDate datetime)
    
    insert into T (ID, OrderDate)
      values ( 1, cast('01/12/2020' as datetime) ),
             ( 2, cast('15/09/2020' as datetime) ),
             ( 2, cast('01/10/2020' as datetime) ),
             ( 3, cast('31/12/2020' as datetime) ),
             ( 4, cast('01/10/2020' as datetime) ),
             ( 4, cast('03/10/2020' as datetime) ),
             ( 4, cast('01/12/2020' as datetime) ),
             ( 5, cast('31/01/2020' as datetime) )
    
    select  *, datediff(day, OrderDate, lag(orderdate) over(partition by ID order by ID, Orderdate desc)) as [Days Between]
    from    T 
    order by ID, OrderDate asc
    
    ID Orderdate Days Between
    1 2020-12-01 00:00:00.000 NULL
    2 2020-09-15 00:00:00.000 16
    2 2020-10-01 00:00:00.000 NULL
    3 2020-12-31 00:00:00.000 NULL
    4 2020-10-01 00:00:00.000 2
    4 2020-10-03 00:00:00.000 59
    4 2020-12-01 00:00:00.000 NULL
    5 2020-01-31 00:00:00.000 NULL

    【讨论】:

    • 我认为你应该理智地检查你的逻辑 - 这表明 2020 年 9 月 15 日和 2020 年 12 月 1 日之间有 16 天 - 77 对我来说似乎更正确
    • 实际上,你是对的 - 我错过了第一行/第二行是差异 ID! 自行终止
    猜你喜欢
    • 2018-12-13
    • 2020-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-22
    相关资源
    最近更新 更多