SQL或Linq:如何在类别更改时分类到不同的批次

问题描述 投票:1回答:1

我有以下数据:

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 linq group-by
1个回答
1
投票

如果我正确地跟着你,你正在处理一个空白和岛屿问题。

在纯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,可以在任何支持窗口功能的平台上运行。

© www.soinside.com 2019 - 2024. All rights reserved.