Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/82.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 选择最后一组连续行中的第一行_Sql_Postgresql_Greatest N Per Group - Fatal编程技术网

Sql 选择最后一组连续行中的第一行

Sql 选择最后一组连续行中的第一行,sql,postgresql,greatest-n-per-group,Sql,Postgresql,Greatest N Per Group,如何选择在连续行的最后一个“分组”中第一次出现的行,其中分组由以下示例状态中特定列值的连续外观定义 例如,给定下表: 身份证件 日期时间 状态 所需的价值 1. 2021-04-01 09:42:41.319000 残缺的 A. 2. 2021-04-04 09:42:41.319000 完成 B 3. 2021-04-05 09:42:41.319000 残缺的 C 4. 2021-04-05 10:42:41.319000 残缺的 C 5. 2021-04-07 09:42:41.31900

如何选择在连续行的最后一个“分组”中第一次出现的行,其中分组由以下示例状态中特定列值的连续外观定义

例如,给定下表:

身份证件 日期时间 状态 所需的价值 1. 2021-04-01 09:42:41.319000 残缺的 A. 2. 2021-04-04 09:42:41.319000 完成 B 3. 2021-04-05 09:42:41.319000 残缺的 C 4. 2021-04-05 10:42:41.319000 残缺的 C 5. 2021-04-07 09:42:41.319000 完成 D 6. 2021-04-012 09:42:41.319000 完成 E 假设所有列都不为空

小提琴

“不存在”仅适用于最后一组对等方。没有其他状态的后续行。
按日期时间订购,然后取第一个。瞧。

这里有一个窗口函数解决方案,它只访问您的表一次,对于大型数据集,它的性能可能会更好,也可能不会更好:

挑选* 从…起 选择*, 按日期时间描述的订单提前期状态 不同于作为组中第一个组的状态 来自tbl T _组中的第一个_在哪里 按日期时间顺序描述 限制1 A基于。为了举例说明,以下是每行的_组中第一个_的值:

id datetime状态值\u需要\u组中的第一个\u ----------------------------------- 6 2021-04-12 09:42:41.319完成E-f 5 2021-04-07 09:42:41.319完成 4 2021-04-05 10:42:41.319不完全C f 3 2021-04-05 09:42:41.319不完全C t 2021-04-04 09:42:41.319完成 1 2021-04-01 09:42:41.319不完整的A t
SELECT *
FROM   tbl t1
WHERE  NOT EXISTS (
   SELECT FROM tbl t2
   WHERE  t2.state <> t1.state
   AND    t2.datetime > t1.datetime
   )
ORDER  BY datetime
LIMIT  1;