【问题标题】:Using SQL Server 2012 how to iterate through an unknown number of rows and calculate date differences使用 SQL Server 2012 如何遍历未知数量的行并计算日期差异
【发布时间】:2019-11-09 18:50:10
【问题描述】:

如果每个 ID 有两个或多个日期,我需要计算平均天数:date1 和 date2、date2 和 date3 之间的天数等。输出需要是每个 ID 每个间隔之间的平均天数.我正在寻找一种解决方案,它遍历每个 ID 的每个日期,然后平均天数

我可以通过 id 创建行号和分区,但在实际数据中,每个 ID 最多可以有 20 行。

CREATE TABLE #ATABLE(
ID   INTEGER  NOT NULL  
,DATE DATE  NOT NULL
);
INSERT INTO #ATABLE(ID,DATE) VALUES (1,'1/1/2019');
INSERT INTO #ATABLE(ID,DATE) VALUES (2,'1/1/2019');
INSERT INTO #ATABLE(ID,DATE) VALUES (2,'1/10/2019');
INSERT INTO #ATABLE(ID,DATE) VALUES (2,'1/20/2019');
INSERT INTO #ATABLE(ID,DATE) VALUES (2,'1/30/2019');
INSERT INTO #ATABLE(ID,DATE) VALUES (3,'1/1/2019');
INSERT INTO #ATABLE(ID,DATE) VALUES (3,'1/10/2019');

--get avg days between orders

DROP TABLE #ATABLE

上面的输出是:

ID  AvgDatediff
1   Null
2   10
3   9

【问题讨论】:

  • 到目前为止你尝试过什么?您需要停止认为 SQL Server(和其他 RDBMS)也是一个应用程序。您应该在 SQL Server 中尽可能地避免 迭代,这很糟糕。 SQL Server 最适合使用基于集合的方法,这似乎可以通过集合方法和LEAD/LAG 之类的函数轻松实现。

标签: sql sql-server select sql-server-2012 iteration


【解决方案1】:
SELECT id, AVG(DayDiff)
FROM (
    SELECT id,
    DATEDIFF(dd, date, LEAD(date) OVER (PARTITION BY id ORDER BY date)) AS DayDiff
    FROM #atable
) as AA
GROUP BY id;

LEAD(source_column) ==> 根据 order by 子句(即此处的日期)选择下一个数据。

【讨论】:

    【解决方案2】:

    获取平均差的最简单方法是:

    SELECT id, DATEDIFF(DAY, MIN(date), MAX(date)) / NULLIF(COUNT(*) - 1, 0)
    FROM  #atable) t
    GROUP BY id;
    

    注意:如果您不想要整数平均值,您可能需要 * 1.0

    换句话说,平均差值是最晚日期减去最早日期除以计数后减一。试试吧。它有效。

    【讨论】:

      【解决方案3】:

      您可以使用lag 获取上一行(每行),然后找到它与当前行之间的差异。然后,您可以将它们平均:

      SELECT   id, AVG(diff)
      FROM     (SELECT id,
                       DATEDIFF(DAY, date, LAG(date) OVER (PARTITION BY id 
                                                           ORDER BY date DESC)) AS diff
                FROM #atable) t
      GROUP BY id;
      

      【讨论】:

        猜你喜欢
        • 2022-08-15
        • 1970-01-01
        • 2015-06-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-12-15
        • 1970-01-01
        相关资源
        最近更新 更多