gpt4 book ai didi

sql - 按月、日、小时+间隔和孤岛问题分组

转载 作者:行者123 更新时间:2023-11-29 13:42:28 25 4
gpt4 key购买 nike

我需要计算(以百分比形式)状态在一天、几小时或一个月 (working_time) 中有多长时间为真。

我将我的表格简化为这个:

| date                      | status    |
|-------------------------- |-------- |
| 2018-11-05T19:04:21.125Z | true |
| 2018-11-05T19:04:22.125Z | true |
| 2018-11-05T19:04:23.125Z | true |
| 2018-11-05T19:04:24.125Z | false |
| 2018-11-05T19:04:25.125Z | true |
....

我需要得到这个结果(取决于参数):

几个小时:

| date                      | working_time |
|-------------------------- |--------------|
| 2018-11-05T00:00:00.000Z | 14 |
| 2018-11-05T01:00:00.000Z | 15 |
| 2018-11-05T02:00:00.000Z | 32 |
|... | ... |
| 2018-11-05T23:00:00.000Z | 13 |

几个月:

| date                      | working_time |
|-------------------------- |--------------|
| 2018-01-01T00:00:00.000Z | 14 |
| 2018-02-01T00:00:00.000Z | 15 |
| 2018-03-01T00:00:00.000Z | 32 |
|... | ... |
| 2018-12-01T00:00:00.000Z | 13 |

我的 SQL 查询如下所示:

 SELECT date_trunc('month', date)                                         as date,
round((EXTRACT(epoch from sum(time_diff)) / 25920) :: numeric, 2) as working_time
FROM (SELECT date,
status as current_status,
(lag(status, 1) OVER (ORDER BY date)) AS previous_status,
(date -(lag(date, 1) OVER (ORDER BY date))) AS time_diff
FROM table
) as raw_data
WHERE current_status = TRUE AND previous_status = TRUE
GROUP BY date_trunc('month', date)
ORDER BY date;

它工作正常但真的很慢。关于优化的任何想法?也许使用 Row_Number() 函数?

最佳答案

试试这个:

   SELECT t.month_reference as date,
round( sum(if(t_aux.status,1,0)) / 25920) :: numeric, 2) as working_time

#我假设你使用这个数字是因为系统的正常运行时间是 60*18*24,

#如果我想要一个月中的总秒数,我会使用它 60*60*24*day(Last_day(t.month_reference))

FROM (SELECT date_trunc('month', t.date) as month_reference
FROM table
) as t
left join table t_aux
on t.month_reference=date_trunc('month', t_aux.date)

所以当我们按月分组时,sum() 只会找到为真且具有引用月份的行

   and t_aux.date < 
(select t1.date
from table t1
where t.month_reference=date_trunc('month', t1.date)
and t1.status=false
order by t1.date asc limit 1 )

我添加这个所以它只选择 true 的行,直到它在同一个月引用中找到状态为 false 的行

    GROUP BY t.month_reference
ORDER BY t.month_reference;

关于sql - 按月、日、小时+间隔和孤岛问题分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53285620/

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