在一个结果行中选择具有给定时间间隔的 id 历史记录的行 [关闭]

Posted

技术标签:

【中文标题】在一个结果行中选择具有给定时间间隔的 id 历史记录的行 [关闭]【英文标题】:selecting rows with id history for a given time interval in one result row [closed] 【发布时间】:2021-01-21 07:05:49 【问题描述】:

一个表 StatusHistory 包含:

ID      Status  DtSince DtUntil    
2415891  0     20200816 20200917
2415891  4     20200917 NULL
2415892  0     20200904 20200905
2415892  4     20200905 NULL

我需要为每个 id 选择每个月初和月底的状态。 用户将输入所需的日期。例如:

用户输入 --> @Month = '202009'

select 语句必须返回dates 20200901 and 20201001 的状态

对于 dtSince>20200901 的新记录,它应该返回活动行。例如,对于 2415892,它应该返回 4

所以@Month = 202009 的结果集应该是:

Id       BeginningOfMonth_status EndOfMonth_status 
2415891       0                         4
2415892       4                         4

这是我的解决方案

select * from
    (
    select * from 
        (
         select *, ROW_NUMBER() over (partition by id  order by dtSince desc) r from  
         dbo.StatusHistory
         where DtUntil  is null or (DtUntil <20201001and dtSince>=20200901) --2432290
        )x
     where x.r=1
)s1
inner join 
   (
   select * from 
       (
        select *, ROW_NUMBER() over (partition by id  order by dtSince desc) r from  
        dbo.StatusHistory
        where DtUntil  is null or (DtUntil <20201001and dtSince>=20200901) --2432290
       )x
   where x.r=2
   )s2
on s1.id = s2.id

问题:

1)还有什么比我的代码更简单的吗?

2)以上,我不满足For records that are new and have dtSince&gt;20200901的要求

【问题讨论】:

您为什么使用不受支持的 SQL Server 版本? 【参考方案1】:

嗯。 . .您可以使用where 子句获取涵盖特定月份的所有行。然后使用row_number() 枚举行和条件聚合:

select id,
       max(case when seqnum_asc = 1 then status end) as beginning_of_month,
       max(case when seqnum_desc = 1 then status end) as end_of_month
from (select t.*,
             row_nunber() over (partition by id order by dtsince) as seqnum_asc,
             row_nunber() over (partition by id order by dtsince desc) as seqnum_desc
      from t
      where dtsince < dateadd(month, 1, convert(date, @Month + '01'))) and
            (dtuntil >= convert(date, @Month + '01') or dtuntil is null)
     ) t
group by id

【讨论】:

以上是关于在一个结果行中选择具有给定时间间隔的 id 历史记录的行 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

限制 PostgreSQL 最小时间间隔的结果行

具有 unnest 的 PostgreSQL 查询不返回空值的结果行

SQL Query - 在一个结果行中显示连接结果[重复]

MySQL 中哪一个更快? COUNT(id) 还是计算结果行? [关闭]

SAP HANA SQL - 将单个列的多个结果行合并为单个行

如何在 Postgres 函数中检索多个结果行?