我有一个我认为可以使用窗口函数解决的情况,但我不确定。
想象一下下表
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 …
给定两个表:
CREATE TABLE foo (ts timestamp, foo text);
CREATE TABLE bar (ts timestamp, bar text);
Run Code Online (Sandbox Code Playgroud)
我想编写一个查询,对于回报值ts,foo以及bar代表最新的值的统一视图。换句话说,如果foo包含:
ts | foo
--------
1 | A
7 | B
Run Code Online (Sandbox Code Playgroud)
并bar包含:
ts | bar
--------
3 | C
5 | D
9 | E
Run Code Online (Sandbox Code Playgroud)
我想要一个返回的查询:
ts | foo | bar
--------------
1 | A | null
3 | A | C
5 | A | D
7 | B | D
9 | B …Run Code Online (Sandbox Code Playgroud) 我需要为每行(每天 1 行)获取 7 天的滚动总和。
例如:
| Date | Count | 7-Day Rolling Sum |
------------------------------------------
| 2016-02-01 | 1 | 1
| 2016-02-02 | 1 | 2
| 2016-02-03 | 2 | 4
| 2016-02-04 | 2 | 6
| 2016-02-05 | 2 | 8
| 2016-02-06 | 2 | 10
| 2016-02-07 | 2 | 12
| 2016-02-08 | 2 | 13 --> here we start summing from 02-02
| 2016-02-09 | 2 | 14 --> here we …Run Code Online (Sandbox Code Playgroud) 以下查询SUM对列存储表执行窗口化处理1500 total rows,每个表的值为 0 或 1,并溢出INT数据类型。为什么会这样?
SELECT a, p, s, v, m, n,
SUM(CASE WHEN n IS NULL THEN 0 ELSE 1 END)
OVER (PARTITION BY s, v, a ORDER BY p) AS lastNonNullPartition
FROM (
SELECT a, p, s, v, m, n,
RANK() OVER (PARTITION BY v, s, a, p ORDER BY m) AS rank
FROM #t /* A columnstore table with 1,500 rows */
) x
WHERE x.rank = 1
--Msg 8115, …Run Code Online (Sandbox Code Playgroud) sql-server columnstore window-functions batch-mode sql-server-2016
我有一个表格,其中包含一列十进制值,例如:
id value size
-- ----- ----
1 100 .02
2 99 .38
3 98 .13
4 97 .35
5 96 .15
6 95 .57
7 94 .25
8 93 .15
Run Code Online (Sandbox Code Playgroud)
我需要完成的事情有点难以描述,所以请耐心等待。我想要做的是创建size列的聚合值,当根据value. 结果看起来像这样:
id value size bucket
-- ----- ---- ------
1 100 .02 1
2 99 .38 1
3 98 .13 1
4 97 .35 1
5 96 .15 2
6 95 .57 2
7 94 .25 2
8 93 .15 3
Run Code Online (Sandbox Code Playgroud)
我天真的第一次尝试是保持运行SUM,然后 …
我有一个表,其中包含两列整型数组的排列/组合,第三列包含一个值,如下所示:
CREATE TABLE foo
(
perm integer[] NOT NULL,
combo integer[] NOT NULL,
value numeric NOT NULL DEFAULT 0
);
INSERT INTO foo
VALUES
( '{3,1,2}', '{1,2,3}', '1.1400' ),
( '{3,1,2}', '{1,2,3}', '0' ),
( '{3,1,2}', '{1,2,3}', '1.2680' ),
( '{3,1,2}', '{1,2,3}', '0' ),
( '{3,1,2}', '{1,2,3}', '1.2680' ),
( '{3,1,2}', '{1,2,3}', '0' ),
( '{3,1,2}', '{1,2,3}', '0' ),
( '{3,1,2}', '{1,2,3}', '1.2680' ),
( '{3,1,2}', '{1,2,3}', '0.9280' ),
( '{3,1,2}', '{1,2,3}', '0' ),
( '{3,1,2}', '{1,2,3}', '1.2680' ),
( …Run Code Online (Sandbox Code Playgroud) 我正在使用 SQL Server 2016 并且我使用的数据具有以下形式。
CREATE TABLE #tab (cat CHAR(1), t CHAR(2), val1 INT, val2 CHAR(1));
INSERT INTO #tab VALUES
('A','Q1',2,NULL),('A','Q2',NULL,'P'),('A','Q3',1,NULL),('A','Q3',NULL,NULL),
('B','Q1',5,NULL),('B','Q2',NULL,'P'),('B','Q3',NULL,'C'),('B','Q3',10,NULL);
SELECT *
FROM #tab;
Run Code Online (Sandbox Code Playgroud)
我想获取列上的最后一个非空值,val1并按val2分组cat和排序t。我寻求的结果是
Run Code Online (Sandbox Code Playgroud)cat val1 val2 A 1 P B 10 C
我最接近的是使用LAST_VALUE而忽略ORDER BY哪个不起作用,因为我需要有序的最后一个非空值。
SELECT DISTINCT
cat,
LAST_VALUE(val1) OVER(PARTITION BY cat ORDER BY (SELECT NULL) ) AS val1,
LAST_VALUE(val2) OVER(PARTITION BY cat ORDER BY (SELECT NULL) ) AS val2
FROM #tab
Run Code Online (Sandbox Code Playgroud)
Run Code Online (Sandbox Code Playgroud)cat val1 val2 …
我有一个包含两列的表,我想计算 Col_B 上(由)Col_A 上的不同值。
我的表
Col_A | Col_B
A | 1
A | 1
A | 2
A | 2
A | 2
A | 3
b | 4
b | 4
b | 5
Run Code Online (Sandbox Code Playgroud)
预期结果
Col_A | Col_B | Result
A | 1 | 3
A | 1 | 3
A | 2 | 3
A | 2 | 3
A | 2 | 3
A | 3 | 3
b | 4 | 2
b | 4 | …Run Code Online (Sandbox Code Playgroud) 我正在尝试提出一个递归 CTE 和/或窗口函数来创建一个函数。
几天后,我将函数归结为(伪代码),我拥有N和B,并且需要生成E:
E n = B n * (1 - SUM( E 1 , E 2 , ... E n-1 ))
?????????????????????????????????
? N ? B ? E ?
?????????????????????????????????
? 0 ? 0.142857143 ? 0.142857143 ?
? 1 ? 0.285714286 ? 0.244897959 ?
? 2 ? 0.285714286 ? 0.174927114 ?
? 3 ? 0.285714286 ? 0.124947938 ?
? 4 ? 0.285714286 ? 0.089248527 ?
? 5 ? 0.4 ? 0.089248527 …Run Code Online (Sandbox Code Playgroud) window-functions ×10
postgresql ×5
sql-server ×4
aggregate ×3
batch-mode ×1
columnstore ×1
count ×1
cte ×1
group-by ×1
join ×1
recursive ×1
t-sql ×1