Questions tagged «gaps-and-islands»

间隙和孤岛问题涉及在数字或日期序列中找到一系列缺失值(间隙)或一系列连续值(孤岛)。

7
将每日时间表分组为[开始日期;结束日期]与星期几的间隔
我需要在两个系统之间转换数据。 First系统将日程表存储为简单的日期列表。计划中包含的每个日期都是一行。日期顺序可能会有各种差异(周末,公共假期和较长的停顿时间,日程表中可能不包括一周中的某些天)。根本没有差距,甚至可以包括周末。日程安排可能长达2年。通常是几个星期。 这是一个跨越两周(不包括周末)的时间表的简单示例(以下脚本中有更复杂的示例): +----+------------+------------+---------+--------+ | ID | ContractID | dt | dowChar | dowInt | +----+------------+------------+---------+--------+ | 10 | 1 | 2016-05-02 | Mon | 2 | | 11 | 1 | 2016-05-03 | Tue | 3 | | 12 | 1 | 2016-05-04 | Wed | 4 | | …

6
从表中查找“ n”个连续的免费电话
我有一些这样的数字表(状态为免费或已分配) id_set号状态 ----------------------- 1 000001已分配 1 000002免费 1 000003已分配 1 000004免费 1 000005免费 1 000006已分配 1 000007已分配 1 000008免费 1 000009免费 1 000010免费 1 000011已分配 1 000012分配 1 000013已分配 1 000014免费 1 000015已分配 并且我需要找到“ n”个连续数字,因此对于n = 3,查询将返回 1 000008免费 1 000009免费 1 000010免费 它应仅返回每个id_set的第一个可能的组(实际上,每个查询仅对id_set执行一次) 我正在检查WINDOW函数,尝试了诸如之类的查询COUNT(id_number) OVER (PARTITION BY id_set ROWS …

7
分组或窗口
我有一种情况,我认为可以使用窗口函数解决,但我不确定。 想象一下下表 CREATE TABLE tmp ( date timestamp, id_type integer ) ; INSERT INTO tmp ( date, id_type ) VALUES ( '2017-01-10 07:19:21.0', 3 ), ( '2017-01-10 07:19:22.0', 3 ), ( '2017-01-10 07:19:23.1', 3 ), ( '2017-01-10 07:19:24.1', 3 ), ( '2017-01-10 07:19:25.0', 3 ), ( '2017-01-10 07:19:26.0', 5 ), …

5
根据前一个月末的值填充丢失的数据
给定以下数据: create table #histories ( username varchar(10), account varchar(10), assigned date ); insert into #histories values ('PHIL','ACCOUNT1','2017-01-04'), ('PETER','ACCOUNT1','2017-01-15'), ('DAVE','ACCOUNT1','2017-03-04'), ('ANDY','ACCOUNT1','2017-05-06'), ('DAVE','ACCOUNT1','2017-05-07'), ('FRED','ACCOUNT1','2017-05-08'), ('JAMES','ACCOUNT1','2017-08-05'), ('DAVE','ACCOUNT2','2017-01-02'), ('PHIL','ACCOUNT2','2017-01-18'), ('JOSH','ACCOUNT2','2017-04-08'), ('JAMES','ACCOUNT2','2017-04-09'), ('DAVE','ACCOUNT2','2017-05-06'), ('PHIL','ACCOUNT2','2017-05-07') ; ...表示何时将给定用户分配给帐户。 我正在寻找谁在每个月的最后一天(分配的日期是该帐户转移所有权的日期)拥有给定帐户的人,并填充所有缺少的月末(可能是从dates我可用的便捷表中创建的,具有有用的列DateKey,Date并且LastDayOfMonth,[由@AaronBertrand提供] 1。 理想的结果将是: PETER, ACCOUNT1, 2017-01-31 PETER, ACCOUNT1, 2017-02-28 DAVE, ACCOUNT1, 2017-03-31 DAVE, ACCOUNT1, 2017-04-30 FRED, ACCOUNT1, 2017-05-31 FRED, …

4
计算总访问量
我正在尝试编写一个查询,其中我必须通过照顾重叠的日子来计算客户的访问次数。假设itemID 2009的开始日期为23日,结束日期为26日,因此项目20010在这几天之间,我们将不将此购买日期添加到我们的总数中。 示例场景: Item ID Start Date End Date Number of days Number of days Candidate for visit count 20009 2015-01-23 2015-01-26 4 4 20010 2015-01-24 2015-01-24 1 0 20011 2015-01-23 2015-01-26 4 0 20012 2015-01-23 2015-01-27 5 1 20013 2015-01-23 2015-01-27 5 0 20014 2015-01-29 2015-01-30 2 2 输出应为7 …

2
选择最长的连续序列
我正在尝试在PostgreSQL 9.0中构造一个查询,以获取特定列的最长连续行序列。 请考虑下表: lap_id (serial), lap_no (int), car_type (enum), race_id (int FK) lap_no每个地方都是独特的(race_id, car_type)。 我希望查询为给定的race_id和生成最长的序列car_type,因此它将返回int最高的(或长)。 带有以下数据: 1, 1, red, 1 2, 2, red, 1 3, 3, red, 1 4, 4, red, 1 5, 1, blue, 1 6, 5, red, 1 7, 2, blue, 1 8, 1, green, 1 对于car_type = …

4
差距和孤岛:客户端解决方案与T-SQL查询
用于间隙和孤岛的T-SQL解决方案能否比在客户端上运行的C#解决方案运行得更快? 具体来说,让我们提供一些测试数据: CREATE TABLE dbo.Numbers ( n INT NOT NULL PRIMARY KEY ) ; GO INSERT INTO dbo.Numbers ( n ) VALUES ( 1 ) ; GO DECLARE @i INT ; SET @i = 0 ; WHILE @i < 21 BEGIN INSERT INTO dbo.Numbers ( n ) SELECT n + …

4
如何合并具有不同有效日期的类似记录?
我正在处理的表包含三个部分: 一个ID柱(在另一个表中的主键) 一些数据列 日期有效from/ to列。 值: ID Data From To 1 a 2015-01-01 2015-01-05 1 a 2015-01-06 2015-01-10 1 b 2015-01-11 2015-01-15 1 a 2015-01-16 2015-01-20 2 c 2015-01-01 2015-01-05 2 c 2015-01-06 2015-01-10 通过以一定间隔获取另一个数据源的“快照”并将有效日期分配给记录来更新表。问题在于这些快照为记录(具有不同的有效日期)创建了重复的条目,这些记录在该时间间隔内根本没有更改。 我想通过查找具有连续日期的行并合并它们并为它们分配一个有效期来减小表的大小。例如: ID Data From To 1 a 2015-01-01 2015-01-10 1 b 2015-01-11 2015-01-15 1 a …

1
在PostgreSQL中压缩序列
我id serial PRIMARY KEY在PostgreSQL表中有一列。id由于我已删除相应的行,因此缺少许多。 现在,我想通过重新启动序列并以保留id原始id顺序的方式重新分配s 来“压缩”表。可能吗? 例: 现在: id | data ----+------- 1 | hello 2 | world 4 | foo 5 | bar 后: id | data ----+------- 1 | hello 2 | world 3 | foo 4 | bar 我尝试了StackOverflow答案中提出的建议,但没有成功: # alter sequence t_id_seq restart; ALTER SEQUENCE # …

2
选择从指定值开始直到另一个指定值的行
我有一个包含几个列的表,想要检查一个列值,选择该列值之后的行,直到显示一个单独的列值。我尝试使用BETWEEN,但是如果列值是整数,则仅查找整数之间的数字。 例如,如果我有一个这样的表: id时间值 t1 12:00 PM 15 t1 12:02 PM 4 t1 12:03 PM 7 t1 12:05 PM 16 t5 12:10 PM 250 t5 12:15 PM 15 t8 11:00 AM 15 t8 3:00 PM 2 t8 3:05 PM 100 t2 7:00 PM 15 t2 7:01 PM 16 t15 5:00 AM …

3
使用Row_Number查找连续的行数
我有这列整数表示信号的出现,我试图添加一列来显示连续行的计数 如果我的数据看起来像这样 724 727 728 733 735 737 743 747 749 具有连续行计数列的结果数据将如下所示 724 1 727 1 728 2 729 3 735 1 737 1 743 1 744 2 748 1 我已经使用循环功能完成了此操作,但正在尝试使用cte进行查找。这是我最近尝试的一个示例 DECLARE @d TABLE ( signal INT ) INSERT INTO @d SELECT 724 UNION SELECT 727 UNION SELECT 728 UNION …
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.