我有一个我认为可以使用窗口函数解决的情况,但我不确定。
想象一下下表
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
我有一列整数表示信号的发生,我正在尝试添加一列显示连续行的计数
如果我的数据看起来像这样
724
727
728
733
735
737
743
747
749
Run Code Online (Sandbox Code Playgroud)
具有连续行计数列的结果数据将如下所示
724 1
727 1
728 2
729 3
735 1
737 1
743 1
744 2
748 1
Run Code Online (Sandbox Code Playgroud)
我已经使用循环函数完成了它,但我正在尝试使用 cte。这是我最近尝试的示例
DECLARE @d TABLE ( signal INT )
INSERT INTO @d
SELECT 724
UNION
SELECT 727
UNION
SELECT 728
UNION
SELECT 729
UNION
SELECT 735
UNION
SELECT 737
UNION
SELECT 743
UNION
SELECT 744
UNION
SELECT 748 ;
WITH a AS ( SELECT signal,
ROW_NUMBER() OVER ( ORDER BY …Run Code Online (Sandbox Code Playgroud) 我有一个包含以下示例数据的队列表:
id company location
1 acme new york
2 acme philadelphia
3 genco st.louis
4 genco san diego
5 genco san francisco
6 acme miami
Run Code Online (Sandbox Code Playgroud)
我想查询每个公司组的队列位置以显示每个公司的排队位置(假设 acme 在 500 Genco 开始之前有 1,000 行,然后在 Genco 记录过程之后 acme 有 5,000 行)。我想要的结果如下所示:
queuePositionId company
1 acme
3 genco
6 acme
Run Code Online (Sandbox Code Playgroud)
我玩过排名和分组,但事实上一个公司组可以在队列中的任何地方多次出现,这一直在扰乱我的聚合。我也尝试过,dense_rank但无法弄清楚顺序。有任何想法吗?
sql-server t-sql sql-server-2008-r2 group-by gaps-and-islands
我有一个表格,其中包含每个项目的状态更改。项目可以多次进入和退出状态。
ItemTable(ItemId int、Status varchar(50)、DateOfChange 日期)
我需要拉出每次更改的日期。但是,由于可以为每个项目重复状态,我不能只执行 min(DateOfChange) 并找到出现的次数。
这是在 OLAP 环境中,用于提取此数据的子查询正在降低性能。
有没有办法通过分区/行号函数来提取这些东西?或者其他在 OLAP 中表现更好的东西?(这是在 SQL 2008 中。)
performance sql-server t-sql gaps-and-islands query-performance
这是一个非常有趣的问题(针对 SQL Server 提出的问题),我想尝试一下,看看它是如何在 PostgreSQL 中完成的。让我们看看其他人是否可以做得更好。拿着这个数据,
CREATE TABLE foo
AS
SELECT pkid::int, numvalue::int, groupid::int
FROM ( VALUES
( 1, -1 , 1 ),
( 2, -2 , 1 ),
( 3, 5 , 1 ),
( 4, -7 , 1 ),
( 5, 1 , 2 )
) AS t(pkid, numvalue, groupid);
Run Code Online (Sandbox Code Playgroud)
我们正在尝试生成这个:
PKID RollingSum GroupID
----------------------------- ## Explanation:
1 0 1 ## 0 - 1 < 0 => 0
2 0 1 ## 0 - 2 < 0 …Run Code Online (Sandbox Code Playgroud) 我有一张表,如下所示:
CAR NAME INSERT DATE
MERCEDES 2018-01-01
SEAT 2018-01-01
MERCEDES 2018-01-02
BMW 2018-01-02
MERCEDES 2018-01-03
MERCEDES 2018-01-04
MERCEDES 2018-01-05
BMW 2018-01-05
BMW 2018-01-06
SEAT 2018-01-07
BMW 2018-01-08
AUDI 2018-01-08
BMW 2018-01-09
BMW 2018-01-10
NULL 2018-01-12
SEAT 2018-01-12
SEAT 2018-01-14
SEAT 2018-01-16
BMW 2018-01-17
NULL 2018-01-19
MERCEDES 2018-01-21
MERCEDES 2018-01-22
MERCEDES 2018-01-23
Run Code Online (Sandbox Code Playgroud)
我想知道有多少次连续CAR NAME插入到表中,排序时INSERT DATE,以及 first 和 last INSERT DATE。出于此查询的目的,CAR NAME应忽略一个连续的结果。
例如:
name count first last
mercedes 3 2018-01-03 2018-01-05
bmw 2 2018-01-05 2018-01-06 …Run Code Online (Sandbox Code Playgroud)