sql - 是否有更有效的方法来编写 SQL 以按日期和列值对计数进行分组
问题描述
H2
我有一个定期存储在数据库中的状态值 -1 或 1 ,我需要计算过去 12 个月按月存储的 -1 和 1 的数量。以下代码有效,但我将在多个地方将其用作派生表,并想知道是否有更有效的方法。
SELECT STATUS_CODE AS STATUS,
COUNT(*) AS STATUS_COUNT,
CASE
WHEN EXTRACT(EPOCH FROM DATEADD(MONTH,-1,CURRENT_DATE)) < EXTRACT(EPOCH FROM LOG_ENTRY_TIME) THEN 'MONTH 1'
WHEN EXTRACT(EPOCH FROM DATEADD(MONTH,-2,CURRENT_DATE)) < EXTRACT(EPOCH FROM LOG_ENTRY_TIME) THEN 'MONTH 2'
WHEN EXTRACT(EPOCH FROM DATEADD(MONTH,-3,CURRENT_DATE)) < EXTRACT(EPOCH FROM LOG_ENTRY_TIME) THEN 'MONTH 3'
WHEN EXTRACT(EPOCH FROM DATEADD(MONTH,-4,CURRENT_DATE)) < EXTRACT(EPOCH FROM LOG_ENTRY_TIME) THEN 'MONTH 4'
WHEN EXTRACT(EPOCH FROM DATEADD(MONTH,-5,CURRENT_DATE)) < EXTRACT(EPOCH FROM LOG_ENTRY_TIME) THEN 'MONTH 5'
WHEN EXTRACT(EPOCH FROM DATEADD(MONTH,-6,CURRENT_DATE)) < EXTRACT(EPOCH FROM LOG_ENTRY_TIME) THEN 'MONTH 6'
WHEN EXTRACT(EPOCH FROM DATEADD(MONTH,-7,CURRENT_DATE)) < EXTRACT(EPOCH FROM LOG_ENTRY_TIME) THEN 'MONTH 7'
WHEN EXTRACT(EPOCH FROM DATEADD(MONTH,-8,CURRENT_DATE)) < EXTRACT(EPOCH FROM LOG_ENTRY_TIME) THEN 'MONTH 8'
WHEN EXTRACT(EPOCH FROM DATEADD(MONTH,-9,CURRENT_DATE)) < EXTRACT(EPOCH FROM LOG_ENTRY_TIME) THEN 'MONTH 9'
WHEN EXTRACT(EPOCH FROM DATEADD(MONTH,-10,CURRENT_DATE)) < EXTRACT(EPOCH FROM LOG_ENTRY_TIME) THEN 'MONTH 10'
WHEN EXTRACT(EPOCH FROM DATEADD(MONTH,-11,CURRENT_DATE)) < EXTRACT(EPOCH FROM LOG_ENTRY_TIME) THEN 'MONTH 11'
WHEN EXTRACT(EPOCH FROM DATEADD(MONTH,-12,CURRENT_DATE)) < EXTRACT(EPOCH FROM LOG_ENTRY_TIME) THEN 'MONTH 12'
ELSE 'DONE'
END AS WEEK_RANGE
FROM MY_TABLE
WHERE EXTRACT(EPOCH FROM DATEADD(MONTH,-12,CURRENT_DATE)) < EXTRACT(EPOCH FROM LOG_ENTRY_TIME)
GROUP BY STATUS_CODE, WEEK_RANGE
order by week_range
运行前面代码的结果。
解决方案
您可以使用以月为单位动态计算与当前日期DATEDIFF()
之间的差异:log_entry_time
SELECT
status_code AS status,
COUNT(*) AS status_count,
DATEDIFF(MONTH, log_entry_time, CURRENT_DATE) month_range
FROM MY_TABLE
WHERE log_entry_time >= DATEADD(MONTH, -12, CURRENT_DATE)
GROUP BY status_code, month_range
ORDER BY month_range
如果LOG_ENTRY_TIME
是date
-like 数据类型,请不要将其转换为 epoch 进行比较,因为这样做会阻止在该列上使用索引。您可以改为进行日期比较,如WHERE
上述查询的子句所示。
推荐阅读
- sql - 如何从两个符号之间的字符串中获取子字符串
- java - CS50 Credit : 似乎找不到错误,
- javascript - 在 $.ajax 中使用“POST”方法传递数据时出现 500 内部服务器错误
- java - java中如何为StringBuffer对象生成哈希码?
- r - 替换缺失值
- python - 使用十六进制转义打印整个字符串,包括可打印字符
- redux - 如何在 redux store 中显示更新后的状态
- go - 在循环内创建 JWT 令牌时在 jwt-go 中获取相同的令牌
- module - 如何将特征的实现拆分为多个文件?
- python - 我在 settings.py 上实现了电子邮件设置,但是当我提交表单时它不起作用