Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 每周事件的不间断发生_Sql Server - Fatal编程技术网

Sql server 每周事件的不间断发生

Sql server 每周事件的不间断发生,sql-server,Sql Server,CHU ISSU DT是一个每周更新1次的日期。因此日期为2017-12-312017-12-24、2017-12-17等。问题出现在周图表列中。如果某件事在2007年第一次发生,并且直到2017年才再次发生,那么图表中的周数将计入其间的所有周数,即使数据并非始终存在 此示例返回: declare @t table([CH_FMT_ID] nvarchar(3),[CH_ISS_DT] date,[CH_RANK] int,[CH_TTL_ID] bigint) INSERT INTO @t

CHU ISSU DT是一个每周更新1次的日期。因此日期为2017-12-312017-12-24、2017-12-17等。问题出现在周图表列中。如果某件事在2007年第一次发生,并且直到2017年才再次发生,那么图表中的周数将计入其间的所有周数,即使数据并非始终存在

此示例返回:

declare @t table([CH_FMT_ID] nvarchar(3),[CH_ISS_DT] date,[CH_RANK] int,[CH_TTL_ID] bigint)

INSERT INTO @t values 
('HSI', '6/15/2002',    28, 397130),
('HSI', '6/8/2002', 24, 397130),
('HSI', '6/1/2002', 23, 397130),
('HSI', '5/25/2002',    20, 397130),
('HSI', '5/18/2002',    13, 397130),
('HSI', '5/11/2002',    12, 397130),
('HSI', '5/4/2002', 11, 397130),
('HSI', '6/15/2002',    28  ,   111111),
('HSI', '6/8/2002', 24  ,   111111),
('HSI', '6/1/2002', 23  ,   111111),
('HSI', '5/25/2002',    20  ,   111111),
('HSI', '5/18/2002',    13  ,   111111),
('HSI', '5/11/2011',    12  ,   111111),
('HSI', '5/4/2011', 11  ,   111111);


SELECT chart.CH_TTL_ID
,chart.[CH_FMT_ID] Chart
,min(chart.[CH_RANK]) Peak
,max(chart.[CH_RANK]) Trough
,count(chart.[CH_RANK]) Weeks
,MIN(chart.CH_ISS_DT) EntryDate
,MAX(chart.CH_ISS_DT) ExitDate
,(DATEDIFF(day, MIN(CH_ISS_DT),MAX(CH_ISS_DT)) / 7) Weeks_Charted
FROM @t chart
group by chart.CH_TTL_ID
,chart.[CH_FMT_ID]
order by Weeks_Charted desc

如果Chu TTL_ID返回2行,一行用2表示,另一行用5表示,或者只返回2表示最近的数据,而max,min则不同,我对此不感兴趣

试试这个查询。按连续周查询组

CH_TTL_ID,Chart,Peak,Trough,Weeks,EntryDate,ExitDate,Weeks_Charted
111111,HSI,11,28,7,2002-05-18,2011-05-11,468
397130,HSI,11,28,7,2002-05-04,2002-06-15,6
一种选择是在SQL2008中使用递归CTE来解决此类问题

select
    CH_TTL_ID, CH_FMT_ID Chart
    ,min([CH_RANK]) Peak
    ,max([CH_RANK]) Trough
    ,count([CH_RANK]) Weeks
    ,MIN(CH_ISS_DT) EntryDate
    ,MAX(CH_ISS_DT) ExitDate
from (
    select
        *, sum(N) over (partition by CH_TTL_ID order by CH_ISS_DT) grp
    from (
        select 
            *, iif(datediff(dd, lag(CH_ISS_DT) over (partition by CH_TTL_ID order by CH_ISS_DT), CH_ISS_DT) = 7, 0, 1) N
        from 
            @t chart
    ) t
) t
group by CH_TTL_ID, CH_FMT_ID, grp

请提供示例数据和所需输出。我正在使用SQLServer2008。我没有iif或lag的权限非常感谢uzi
;with cte as (
    select 
        *,row_number() over (partition by CH_TTL_ID, CH_FMT_ID order by CH_ISS_DT) rn
    from
        @t chart
)
, rcte as (
    select
        *, 1 grp
    from
        cte
    where
        rn = 1
    union all
    select
        a.CH_FMT_ID, b.CH_ISS_DT, b.CH_RANK, a.CH_TTL_ID, b.rn, a.grp + case when datediff(dd, a.CH_ISS_DT, b.CH_ISS_DT) = 7 then 0 else 1 end
    from
        rcte a
        join cte b on a.CH_FMT_ID = b.CH_FMT_ID and a.CH_TTL_ID = b.CH_TTL_ID and a.rn + 1 = b.rn
)

select
    CH_TTL_ID, CH_FMT_ID Chart
        ,min([CH_RANK]) Peak
        ,max([CH_RANK]) Trough
        ,count([CH_RANK]) Weeks
        ,MIN(CH_ISS_DT) EntryDate
        ,MAX(CH_ISS_DT) ExitDate
from
    rcte
group by CH_TTL_ID, CH_FMT_ID, grp
order by CH_FMT_ID, CH_TTL_ID

option (maxrecursion 0)