感谢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()
从中减去,则整个条纹最终将归入同一组(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()
完成工作。
运行连续的 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作为事件返回。运行时间。 有任