【问题标题】:TSQL- Finding the difference in days of multiple records in SQL ServerTSQL-在 SQL Server 中查找多条记录的天数差异
【发布时间】:2011-06-17 11:54:58
【问题描述】:

SQL Server 2008 R2 是否可以找出不同记录的天数差异?

SELECT OrderDate FROM OrdersTbl WHERE SKU='AA0000' ORDER BY ORDERDATE DESC


OrderDate
-----------------------
2009-12-03 00:00:00.000
2009-04-03 00:00:00.000
2008-02-22 00:00:00.000
2008-02-21 00:00:00.000
2007-02-18 00:00:00.000
2007-01-27 00:00:00.000
2006-10-13 00:00:00.000

我想要一种方法来获取每个订单日期之间的天数,以便我可以找到平均频率。提前致谢。

【问题讨论】:

    标签: sql tsql sql-server-2008 average datediff


    【解决方案1】:
    ;With cteDifference as (
        Select SKU, OrderDate, Row_Number() OVER (Partition by SKU Order by OrderDate) as RowNumber
            from OrdersTbl 
    )
    select cur.SKU, 
           cur.OrderDate as CurrentDate, 
           prev.OrderDate as PreviousDate, 
           DATEDIFF(DD,prev.OrderDate, cur.OrderDate) as DaysDifference 
        from cteDifference cur
            left join cteDifference prev
                on cur.SKU = prev.SKU
                    and cur.RowNumber = prev.RowNumber + 1
        where cur.SKU = 'AA0000'
        order by cur.OrderDate desc
    

    【讨论】:

    • 这很有帮助,但并不完整。不过谢谢。对此,我真的非常感激。这确实帮助我验证了答案。
    • @pqsk:不完整?您说“我想要一种方法来获取每个订单日期之间的天数”我相信我的查询满足了该要求。
    • 如果您继续阅读:“...这样我就可以找到平均频率”。没什么不好,我只是带着完整的答案去了。对此,我真的非常感激。我可以更好地消化这些知识。谢谢。
    【解决方案2】:

    您可以使用公用表表达式和 ROW_NUMBER:

    WITH OrderDates AS (
        SELECT 
            ROW_NUMBER() OVER (ORDER BY OrderDate DESC) AS RowNumber,
            OrderDate
        FROM OrdersTable 
        WHERE SKU = 'AA0000'
    )
    SELECT
        AVG(DATEDIFF(DD, O2.OrderDate, O1.OrderDate)) AS AverageFrequency
    FROM OrderDates O1
    LEFT JOIN OrderDates O2
        ON O2.RowNumber = O1.RowNumber + 1
    

    【讨论】:

    • 美丽,美丽。哦,我找不到最好的解决方案,但是是的,这就是我需要的。非常感谢。 :)
    【解决方案3】:

    糟糕的是,SQL Server 中没有 LEAD/LAG 支持:

    SELECT z.orderdate,
           z.prev_date,
           DATEDIFF(dd, z.prev_date, z.orderdate)
      FROM (SELECT OrderDate,
                   (SELECT MAX(y.orderdate)
                      FROM ORDERSTBL y
                     WHERE y.orderdate < x.orderdate
                       AND y.sku = x.sku) AS prev_date
              FROM OrdersTbl x
             WHERE x.sku ='AA0000') z
    ORDER BY z.orderdate DESC
    

    【讨论】:

    • 这很有帮助。非常感谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-26
    • 1970-01-01
    • 1970-01-01
    • 2014-08-20
    相关资源
    最近更新 更多