gpt4 book ai didi

sql - 计算列日期范围内每个日期出现的行数

转载 作者:行者123 更新时间:2023-12-02 19:42:07 25 4
gpt4 key购买 nike

我有一个包含如下数据的表格

Group       Start Date        End Date
A 01/01/01 01/03/01
A 01/01/01 01/02/01
A 01/03/01 01/04/01
B 01/01/01 01/01/01
ETC

我希望生成一个可以对每一天进行计数的 View ,如下所示

Group       Date        Count
A 01/01/01 2
A 01/02/01 2
A 01/03/01 2
A 01/04/01 1
B 01/01/01 1

我正在使用 Oracle 9,完全不知道如何处理这个问题,并且正在寻找任何让我开始的想法。
注意:生成一个表格来保存日期是不切实际的,因为我的最终产品必须分割到分钟。

最佳答案

WITH    q AS
(
SELECT (
SELECT MIN(start_date)
FROM mytable
) + level - 1 AS mydate
FROM dual
CONNECT BY
level <= (
SELECT MAX(end_date) - MIN(start_date)
FROM mytable
)
)
SELECT group, mydate,
(
SELECT COUNT(*)
FROM mytable mi
WHERE mi.group = mo.group
AND q BETWEEN mi.start_date AND mi.end_date
)
FROM q
CROSS JOIN
(
SELECT DISTINCT group
FROM mytable
) mo

更新:

利用分析函数更好、更快的查询。

主要思想是,包含每个日期的范围数是该日期之前开始的范围计数与该日期之前结束的范围计数之间的差。

SELECT  cur_date,
grouper,
SUM(COALESCE(scnt, 0) - COALESCE(ecnt, 0)) OVER (PARTITION BY grouper ORDER BY cur_date) AS ranges
FROM (
SELECT (
SELECT MIN(start_date)
FROM t_range
) + level - 1 AS cur_date
FROM dual
CONNECT BY
level <=
(
SELECT MAX(end_date)
FROM t_range
) -
(
SELECT MIN(start_date)
FROM t_range
) + 1
) dates
CROSS JOIN
(
SELECT DISTINCT grouper AS grouper
FROM t_range
) groups
LEFT JOIN
(
SELECT grouper AS sgrp, start_date, COUNT(*) AS scnt
FROM t_range
GROUP BY
grouper, start_date
) starts
ON sgrp = grouper
AND start_date = cur_date
LEFT JOIN
(
SELECT grouper AS egrp, end_date, COUNT(*) AS ecnt
FROM t_range
GROUP BY
grouper, end_date
) ends
ON egrp = grouper
AND end_date = cur_date - 1
ORDER BY
grouper, cur_date

此查询在 1 秒内完成,针对 1,000,000 行。

有关更多详细信息,请参阅我的博客中的此条目:

关于sql - 计算列日期范围内每个日期出现的行数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1394153/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com