标签: gaps-and-islands

根据连续出现的情况对数据进行计数和分组

我很难定义问题,也许你通过我的虚拟数据理解它

我有这个数据:

PK, TaskPK
1, 1    
2, 1     
3, 2    
4, 2    
5, 5    
6, 1 
7, 1     
8, 2 
9, 2   
10, 5    
11, 5
Run Code Online (Sandbox Code Playgroud)

现在我必须数TaskPK一下,我提出这个查询

Select PK, TaskPK, Count(*)
From tbl
Group by TaskPK
Run Code Online (Sandbox Code Playgroud)

带来了这样的结果

TaskPK, Count(*)
1, 4
2, 4
5, 3
Run Code Online (Sandbox Code Playgroud)

但我想要稍微不同的结果

像这样

TaskPK, Count(*)
1, 2
2, 2
5, 1
1, 2
2, 2
5, 2
Run Code Online (Sandbox Code Playgroud)

上面的结果基于连续的数据出现,因为TaskPK从1开始(它分组在一起),然后它改变它2(它分组在一起),然后5(它分组在一起)taskPK。但是当TaskPK再次变为1时,那么它应该单独分组,不与之前出现的1联系起来,这个任务单独计数

这可能吗?

mysql gaps-and-islands

2
推荐指数
1
解决办法
4683
查看次数

按 2 行结果排序会导致 800% 的性能下降

下面的查询,对一个大约 600 万行的表运行需要 25 秒。当我删除最终订单时,它会在 3 秒内运行。表上没有索引(它是一个中间 SSIS ETL 目标,后来被拉入 DW。)

它不是缓存。我以任何顺序多次运行它,结果一致。

查询本身会检查序列号中的差距。SSIS 将使用它来查看是否需要重新获取任何内容。

;with edges as
(
    select 
        ROW_NUMBER() over (partition by s1.SiteIDNumber order by s1.SequenceNumber) as rn,
        s1.SiteIDNumber, 
        s1.SequenceNumber
    from TestPlay s1
    left join TestPlay s2 on s2.SiteIDNumber = s1.SiteIDNumber and s2.SequenceNumber = s1.SequenceNumber + 1
    left join TestPlay s3 on s3.SiteIDNumber = s1.SiteIDNumber and s3.SequenceNumber = s1.SequenceNumber - 1
    where s2.SiteIDNumber is null 
    or s3.SiteIDNumber is null
),
gaps as
(
    select 
        e.rn,
        e.SiteIDNumber,
        e.SequenceNumber  + 1 …
Run Code Online (Sandbox Code Playgroud)

performance sql-server t-sql sql-server-2012 gaps-and-islands

1
推荐指数
1
解决办法
102
查看次数

查询以查找指定日期之间的活跃天数(状态 = ON 的天数)

我有一张表格,如下所示:

create table z_test_duration
( Days     date,
  Status   char(8)
);
Run Code Online (Sandbox Code Playgroud)

样本数据如下:

地位
2022 年 1 月 1 日
2022 年 1 月 2 日
2022 年 1 月 3 日
2022 年 1 月 4 日 离开
2022 年 1 月 5 日
2022 年 1 月 6 日 离开
2022 年 1 月 7 日
2022 年 1 月 8 日
2022 年 1 月 9 日 离开

想要的结果是这样的

时间到了 OFF_DATE COUNT_OF_ACTIVE_DAYS …

sql-server gaps-and-islands sql-server-2016

0
推荐指数
1
解决办法
2752
查看次数

确定连续出现的值

我有一张表,如下所示:

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)

sql-server gaps-and-islands

-1
推荐指数
1
解决办法
1万
查看次数