我有一个名为asset_reporting
的数据库表,看起来像这样
asset_id asset_type entered_at exited_at site_id
100 Cage 2019-05-02 10:00:00 2019-05-04 10:00:00 25
102 Cage 2019-05-03 10:00:00 null 25
103 Container 2019-05-01 10:00:00 2019-05-03 10:00:00 25
我需要计算在给定时间范围内资产在特定站点停留多长时间的总运行时间。假设我正在查看的时间范围是从2019-05-01到2019-05-05,我需要的输出低于按天计算
day asset_type count
2019-05-01 Cage 0
2019-05-01 Container 1
2019-05-02 Cage 1
2019-05-02 Container 1
2019-05-03 Cage 2
2019-05-03 Container 1
2019-05-04 Cage 2
2019-05-04 Container 0
2019-05-05 Cage 1
2019-05-05 Container 0
到目前为止,我的查询如下。我无法弄清楚如何保持资产在站点上的总运行天数
select date(ar.entered_at) as day, asset_type, count(*) from asset_reporting ar
group by day,asset_type
下面是上面查询的输出。请注意,这不是我上面的预期输出。
day asset_type count
2019-05-01 Cage 0
2019-05-01 Container 1
2019-05-02 Cage 1
2019-05-02 Container 0
2019-05-03 Cage 1
2019-05-03 Container 0
2019-05-04 Cage 0
2019-05-04 Container 0
2019-05-05 Cage 0
2019-05-05 Container 0
答案 0 :(得分:0)
我们可以使用日历表方法解决此问题:
WITH dates AS (
SELECT '2019-05-01'::date AS day UNION ALL
SELECT '2019-05-02'::date UNION ALL
SELECT '2019-05-03'::date UNION ALL
SELECT '2019-05-04'::date UNION ALL
SELECT '2019-05-05'::date
)
SELECT
d.day,
at.asset_type,
COUNT(ar.asset_type) AS count
FROM dates d
CROSS JOIN (SELECT DISTINCT asset_type FROM asset_reporting) at
LEFT JOIN asset_reporting ar
ON at.asset_type = ar.asset_type AND
(d.day >= ar.entered_at::date OR ar.entered_at IS NULL) AND
(d.day <= ar.exited_at::date OR ar.exited_at IS NULL)
GROUP BY
d.day,
at.asset_type
ORDER BY
d.day,
at.asset_type;