我有一些这样的数字表(状态是免费的或分配的)
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 UNBOUNDED PRECEDING),但这就是我得到的:) 我想不出逻辑,如何在 …
我需要在两个系统之间转换数据。
第一个系统将日程表存储为简单的日期列表。计划中包含的每个日期都是一行。日期顺序可能存在各种差异(周末、公共假期和更长的停顿,一周中的某些日子可能会被排除在日程之外)。根本没有间隙,甚至可以包括周末。该时间表最长可达 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 |
| 13 | 1 | 2016-05-05 | Thu | 5 |
| 14 | 1 | 2016-05-06 | Fri | 6 |
| 15 | 1 | 2016-05-09 | …Run Code Online (Sandbox Code Playgroud) 我有一个我认为可以使用窗口函数解决的情况,但我不确定。
想象一下下表
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 ),
( '2017-01-10 07:19:27.1', 3 ),
( '2017-01-10 07:19:28.0', 5 ),
( '2017-01-10 07:19:29.0', 5 ),
( '2017-01-10 07:19:30.1', 3 ),
( '2017-01-10 07:19:31.0', 5 ),
( '2017-01-10 07:19:32.0', 3 ), …Run Code Online (Sandbox Code Playgroud) postgresql window-functions group-by gaps-and-islands postgresql-8.4
我正在尝试在 PostgreSQL 9.0 中构建一个查询,该查询获取特定列的最长连续行序列。
考虑下表:
lap_id (serial), lap_no (int), car_type (enum), race_id (int FK)
Run Code Online (Sandbox Code Playgroud)
lap_no每个(race_id, car_type). where都是独一无二的。
我希望查询为给定的race_idand生成最长的序列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
Run Code Online (Sandbox Code Playgroud)
对于car_type = red and race_id = 1查询将5作为lap_no字段的最长序列返回。
(我也想知道car_type …
我正在尝试编写一个查询,我必须通过处理重叠天数来计算客户的访问次数。假设 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
Run Code Online (Sandbox Code Playgroud)
OutPut 应该是 7 VisitDays
输入表:
CREATE TABLE #Items
(
CustID INT,
ItemID INT,
StartDate DATETIME,
EndDate DATETIME
)
INSERT INTO #Items
SELECT 11205, …Run Code Online (Sandbox Code Playgroud) 鉴于以下数据:
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') ;
Run Code Online (Sandbox Code Playgroud)
...代表给定用户分配给帐户的时间。
我希望在每个月的最后一天确定谁拥有给定的帐户(分配的日期是帐户转移所有权的日期),并填充任何缺失的月末(可能是从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, ACCOUNT1, 2017-06-30
FRED, ACCOUNT1, 2017-07-31
JAMES, ACCOUNT1, 2017-08-31
PHIL, ACCOUNT2, 2017-01-31
PHIL, ACCOUNT2, 2017-02-28
PHIL, ACCOUNT2, 2017-03-31 …Run Code Online (Sandbox Code Playgroud) 我正在处理的表包含三个组成部分:
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
Run Code Online (Sandbox Code Playgroud)
该表通过以某些时间间隔拍摄另一个数据源的“快照”并将有效日期分配给记录来更新。问题是这些快照会为在该时间间隔内根本没有更改的记录(具有不同的有效日期)创建重复条目。
我想通过查找具有连续日期的行并合并它们并为它们分配一个有效期来减小表的大小。例如:
ID Data From To
1 a 2015-01-01 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-10
Run Code Online (Sandbox Code Playgroud)
我目前的逻辑是:
我知道游标效率很低(我有一个很大的数据集),所以我正在寻找其他方法。
针对间隙和孤岛的 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 + POWER(2, @i)
FROM dbo.Numbers ;
SET @i = @i + 1 ;
END ;
GO
CREATE TABLE dbo.Tasks
(
StartedAt SMALLDATETIME NOT NULL ,
FinishedAt SMALLDATETIME …Run Code Online (Sandbox Code Playgroud) 如何用和解决gaps-and-islands的孤岛部分。我现在已经看过几次了,我想知道是否有人可以解释一下,dense_rank()row_number()
让我们使用这样的东西作为示例数据(示例使用 PostgreSQL),
CREATE TABLE foo
AS
SELECT x AS id, trunc(random()*3+1) AS x
FROM generate_series(1,50)
AS t(x);
Run Code Online (Sandbox Code Playgroud)
这应该产生这样的东西。
id | x
----+---
1 | 3
2 | 1
3 | 3
4 | 3
5 | 3
6 | 2
7 | 3
8 | 2
9 | 1
10 | 3
...
Run Code Online (Sandbox Code Playgroud)
我们想要的是这样的...... (z我们可以使用的价值在哪里GROUP BY)
id | x | grp
----+------
1 | 3 | z
2 | …Run Code Online (Sandbox Code Playgroud) 我有一个包含以下数据的表:
userID tStamp status
------ ------------------- ------
Jason 2017-10-18 03:20:00 idle
Brown 2017-10-18 03:20:28 idle
Brown 2017-10-18 03:25:28 idle
Brown 2017-10-18 04:00:28 active
Brown 2017-10-18 04:10:28 active
Brown 2017-10-18 04:35:28 idle
Brown 2017-10-18 04:45:28 idle
Run Code Online (Sandbox Code Playgroud)
我想提取具有相同状态的连续行。例如,我想查看用户在 'idle' status,然后是 'active' status,然后是 'idle' status,等等所花费的时间。
如何在单个 SQL 查询中执行此操作?
我想要的输出如下:
userID staus Duration_in_this_status (min)
------ ------------------- ------
Jason idle ---
Brown idle 5
Brown active 10
Brown idle 10
Run Code Online (Sandbox Code Playgroud)