所以,我有一个或多或少像这样的表:
| ID | Start | End |
| 01 | 2018-01-01 | 2018-04-01|
| 02 | 2018-01-03 | 2018-02-02|
| 03 | 2018-02-01 | 2018-05-03|
(表格1)
所以,我希望有一个新表,每天有一行,并且计算当天“活动”的行数(即,start <= day <= end)。就像是:
| Day | Number of items |
| 2018-01-01 | 1 |
| 2018-01-02 | 1 |
(直到当前日期)
我试过了:
SELECT
COUNT(CASE WHEN Start <= day AND (End IS NULL OR End >= day) THEN 1 ELSE NULL END)
FROM
(select date(d) as day
from generate_series(
'2018-01-01',
current_date,
'1 day'
) d ) AS g, Table_1 AS ppr
GROUP BY day;
但它似乎不起作用(没有错误,查询只需要永远和超时)。我们为每一天创建一条新线的部分似乎有效,我已经尝试过了。问题在于计算每天“活跃”项目的数量。有人看到了解决方案吗?
我在您当前的方法中看到的主要问题是您正在日历表和包含范围的表之间进行交叉连接。我认为你打算在这里做的是你的日历表和包含范围的表之间的隐式连接:
WITH calendar AS (
SELECT date::date
FROM generate_series ('2018-01-01'::date, current_date, '1 day'::interval) date
)
SELECT c.date, COUNT(t.Start) AS num_items
FROM calendar c
LEFT JOIN Table_1 t
ON c.date >= t.Start AND (c.date <= t.End OR t.End IS NULL)
GROUP BY
c.date
ORDER BY
c.date;
为了便于解释,我们会计算数据表中的Start
列。这是有效的,因为对于与任何东西不匹配的日期,该日期只有一条记录,并且所有加入的列都是NULL
(因此计数为零)。您可以在演示中看到正确处理带有NULL
结尾的范围的边缘情况。