oracle - Oracle查询按连续值分组并获取开始日期和结束日期
问题描述
我有一个这样的表(实际上是大型查询的结果):
id | date_measured | out_of_range
-----+-----------------------+--------------
3147 | 09/08/2019 20.00:00 | 1
3147 | 09/08/2019 21.00:00 | 0
3147 | 09/08/2019 22.00:00 | 0
3147 | 09/08/2019 23.00:00 | 1
3147 | 10/08/2019 00.00:00 | 1
3147 | 10/08/2019 01.00:00 | 1
3147 | 10/08/2019 02.00:00 | 0
3125 | 09/08/2019 20.00:00 | 0
3125 | 09/08/2019 21.00:00 | 1
3125 | 09/08/2019 22.00:00 | 1
3125 | 09/08/2019 23.00:00 | 0
3125 | 10/08/2019 00.00:00 | 1
3125 | 10/08/2019 01.00:00 | 1
3125 | 10/08/2019 02.00:00 | 1
我需要这个结果:
id | date_measured_start | date_measured_end | consecutive_out_of_range
-----+-----------------------+-----------------------+--------------------------
3147 | 09/08/2019 20.00:00 | 09/08/2019 20.00:00 | 1
3147 | 09/08/2019 23.00:00 | 10/08/2019 01.00:00 | 3
3125 | 09/08/2019 21.00:00 | 09/08/2019 22.00:00 | 2
3125 | 10/08/2019 00.00:00 | 10/08/2019 02.00:00 | 3
这是值out_of_range = 1和相对开始和结束日期的连续重复。
我尝试使用此解决方案,但我不能只有连续的1用于out_of_range。价值。
解决方案
ROW_NUMBER
如果给每一行两个递增的数值,则使用分析函数 - 每对一个id
,另一个每id
对out_of_range
。如果您从另一个中减去一个,则结果数字将在具有相同id
/out_of_range
值的一组连续行中保持不变,您可以使用它来GROUP BY
:
查询:
SELECT id,
MIN( date_measured ) AS date_measured_start,
MAX( date_measured ) AS date_measured_end,
COUNT( * ) AS consecutive_out_of_range
FROM (
SELECT t.*,
ROW_NUMBER() OVER ( PARTITION BY id ORDER BY date_measured )
- ROW_NUMBER() OVER ( PARTITION BY id, out_of_range ORDER BY date_measured )
AS rn
FROM table_name t
)
WHERE out_of_range = 1
GROUP BY id, rn
输出:
身份证 | DATE_MEASURED_START | DATE_MEASURED_END | CONSECUTIVE_OUT_OF_RANGE ---: | :----------------- | :----------------- | ----------------------: 第3147章 2019-08-09 20:00:00 | 2019-08-09 20:00:00 | 1 第3147章 2019-08-09 23:00:00 | 2019-08-10 01:00:00 | 3 3125 | 2019-08-10 00:00:00 | 2019-08-10 02:00:00 | 3 3125 | 2019-08-09 21:00:00 | 2019-08-09 22:00:00 | 2
db<>在这里摆弄
推荐阅读
- javascript - 通过 LZString 压缩 Base64 字符串会产生 SyntaxErrors
- python - 正则表达式环视 (?![\+\.])
- reactjs - 在“Connect(withRedux(MyApp))”的上下文中找不到“store”
- sas - 从 SAS 中的多个数据集中获得并减去观察总数
- c# - 使用 mvvm 时可以更改属性文本的颜色吗?
- c# - IIS 中的 Xaml 渲染不起作用(但在 IISExpress 中)
- sql - Access 2013 追加查询仅添加新的日期记录不存在
- javascript - 视频 JS 在 iOS Safari 浏览器和 Android 默认浏览器中无法正常播放
- sql - 如何在 Postgresql 中连接两个表以更新一个表
- python - 从派生自 C++ 抽象类的 Python 对象转换 C++ 抽象类