当前位置: 首页 > 面试题库 >

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

屈浩波
2023-03-14
问题内容

感谢Mike提出的添加创建/插入语句的建议。

create table test (
  pid integer not null,
  date date not null,
  primary key (pid, date)
);

insert into test values
  (1,'2014-10-1')
, (1,'2014-10-2')
, (1,'2014-10-3')
, (1,'2014-10-5')
, (1,'2014-10-7')
, (2,'2014-10-1')
, (2,'2014-10-2')
, (2,'2014-10-3')
, (2,'2014-10-5')
, (2,'2014-10-7');

我想添加一个新列,即“当前条纹天数”,因此 结果 如下所示:

pid    | date      | in_streak
-------|-----------|----------
1      | 2014-10-1 | 1
1      | 2014-10-2 | 2
1      | 2014-10-3 | 3
1      | 2014-10-5 | 1
1      | 2014-10-7 | 1
2      | 2014-10-2 | 1
2      | 2014-10-3 | 2
2      | 2014-10-4 | 3
2      | 2014-10-6 | 1

但我不知道如何将dense_rank()技巧与其他窗口功能结合使用以获取正确的结果。


问题答案:

在此表上构建(不使用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_streak
FROM  (
   SELECT *
        , the_date - '2000-01-01'::date
        - row_number() OVER (PARTITION BY pid ORDER BY the_date) AS grp
   FROM   tbl
) sub
ORDER  BY pid, the_date;

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

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()完成工作。



 类似资料:
  • 运行连续的 promise。 使用 Array.reduce() 通过创建 promise 链来运行连续的 promises,其中每个 promise 在 resolved 时返回下一个 promise 。 const runPromisesInSeries = ps => ps.reduce((p, next) => p.then(next), Promise.resolve()); cons

  • 我在这里试图实现的是,当用户选择ComboBox中的数据时,它会将其与我的HashMap匹配,并将其添加到ArrayList中。 代码有效。输出为: (用户从组合框中选择了 LOTR 1) 但是当我再次单击该按钮时,ArrayList会重置。我想要的是让ArrayList继续添加数据而不替换初始数据,即使它是重复的。例如: 基本上,用户可以从ComboBox中选择无数次,ArrayList不断添加

  • 我在Postgres数据库中有一个查询,它结合了客户端订阅。 我想添加一个称为“连续月份”的变量,但我不确定在Postgres中如何添加。 我的原始桌子是这样的: 我希望有一个连续数月的东西,比如: 谢谢你在先进的帮助!

  • 问题内容: 假设我在numpy数组中有一堆数字,并且根据返回布尔数组的条件对它们进行了测试: 并使用此布尔数组,我想计算True连续出现的所有长度。例如,如果我有,我想回去。 我可以使用以下代码来做到这一点: 但是是否已经为此或python,numpy,scipy等函数实现了任何功能,该函数计算给定输入在列表或数组中连续出现的长度? 问题答案: 这是使用的解决方案(可能不是最快的解决方案):

  • 问题内容: 我希望为每个人计算连续的一天咒语。 我的表: 这是我目前拥有的代码: 产生结果: 在我正在寻找这样的结果集的地方: 我需要计算连续1天以上的连续天数。然后将其作为某人拥有多少个连续咒语的总和。例如,弗雷德在这段时间内连续2次生病。如果某人有星期五和星期一休息,我也需要此内容,这应该算作一个连续的咒语。 我对如何到达那里有些迷失。任何帮助将不胜感激。 请参阅:http ://sqlfid

  • 问题内容: 我有一张table: 我想构造一个语句,给定一个事件可以返回从该事件开始的事件“运行”的长度。运行由以下方式定义: 如果两个事件之间的时间间隔不超过30秒,则两个事件将同时运行。 如果A和B一起运行,并且B和C一起运行,则A与C一起运行。 但是,我的查询不需要在时间上倒退,因此,如果我选择事件2,则仅将事件2、3和4计为从2开始的事件运行的一部分,而应将3作为事件返回。运行时间。 有任