栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

如何在连续几天的“连续变化”中向行添加运行计数

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

如何在连续几天的“连续变化”中向行添加运行计数

在此表上构建(不使用SQL关键字“ date”作为列名。):

CREATE TABLE tbl(  pid int, the_date date, PRIMARY KEY (pid, the_date));

询问:

SELECt pid, the_date     , row_number() OVER (PARTITION BY pid, grp ORDER BY the_date) AS in_streakFROM  (   SELECt *        , the_date - '2000-01-01'::date        - row_number() OVER (PARTITION BY pid ORDER BY the_date) AS grp   FROM   tbl) subORDER  BY pid, the_date;

date
从另一个减去a
date
得到一个
integer
。由于您一直在寻找连续的日子,因此下一行将增加
。如果
row_number()
从中减去,则整个条纹最终将归入同一组(
grp
pid
。然后,很容易按组分配数字。

grp
用两个减法计算得出,这应该是最快的。同样快速的替代方法可能是:

the_date - row_number() OVER (PARTITION BY pid ORDER BY the_date) * interval '1d' AS grp

一乘一减。字符串连接和转换更昂贵。用进行测试

EXPLAIN ANALYZE

不要忘记

pid
两个 步骤中 进行额外的分区,否则您会无意间混淆了应该分开的组。

使用子查询,因为它通常比CTE快。这里没有什么是普通子查询无法完成的。

既然您提到了它:在这里

dense_rank()
显然 没有
必要。基本
row_number()
完成工作。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/400246.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号