我有以下数据:
Timestamp Min MAX Category
2019-03-22 08:10 12.00 5.10 AAAA
2019-03-22 08:11 10.00 5.20 AAAA
2019-03-22 08:12 11.00 4.90 AAAA
2019-03-22 08:13 12.00 5.30 BBBB
2019-03-22 08:14 14.00 5.20 BBBB
2019-03-22 08:15 9.40 5.20 CCCC
2019-03-22 08:16 7.40 5.10 CCCC
2019-03-22 08:17 14.00 5.10 AAAA
2019-03-22 08:17 14.00 5.10 AAAA
我正在寻找一个SQL(或Linq)查询,根据Category
更改对此数据进行分组,以便能够随时查看每个类别的开始和结束。
如果我正确地跟着你,你正在处理一个空白和岛屿问题。
在纯SQL中,这通常使用窗口函数和聚合来解决。行号之间的差异为您提供每个记录所属的组:
SELECT
category,
MIN(timestamp) start_timestap,
MAX(timestamp) end_timestap
FROM (
SELECT
t.*,
ROW_NUMBER() OVER(ORDER BY Timestamp) rn1,
ROW_NUMBER() OVER(PARTITION BY Category ORDER BY Timestamp) rn2
FROM mytable t
) x
GROUP BY category, rn1 - rn2
ORDER BY start_timestap
在this DB Fiddle中,您的样本数据会返回:
| category | start_timestap | end_timestap |
| -------- | ------------------- | ------------------- |
| AAAA | 2019-03-22 08:10:00 | 2019-03-22 08:12:00 |
| BBBB | 2019-03-22 08:13:00 | 2019-03-22 08:14:00 |
| CCCC | 2019-03-22 08:15:00 | 2019-03-22 08:16:00 |
| AAAA | 2019-03-22 08:17:00 | 2019-03-22 08:17:00 |
注意:这是一个MySQL 8.0 DB小提琴,但这是标准的ANSI SQL,可以在任何支持窗口功能的平台上运行。