SQL - 过滤掉整行以去除“占位符”数据

时间:2021-04-12 05:09:12

标签: sql group-by

以下查询:

select
    dim.DW_SK_IndsatsDetaljer,
    dim.VisitationId as VisitationsId,
    dim.BestillingId as BestillingId,
    dim.ServicePeriodeSlut as ServicePeriodeSlut
from nexus2.Dim_IndsatsDetaljer as dim
where DW_SK_IndsatsDetaljer = '3803872' or DW_SK_IndsatsDetaljer = '3803871'

产生以下内容:

DW_SK_IndsatsDetaljer   VisitationsId   BestillingId    ServicePeriodeSlut
3803871                 589682          589683          2019-09-23
3803872                 589682          589682          9999-12-31

从消息来源来看,我知道 9999-12-31 是一个占位符,在系统注册实际日期之前一直存在。所以我确实需要它,除非在这种情况下注册了另一个日期。 我可以从 VisitationsId 看到,这是同一个事务,所以我不需要占位符在这种情况下。 DW_SK_IndsatsDetaljer 无非是一个行Id,在Visitation 有事情发生时生成BestillingId。

所以我相信获得 max(bestillingId) 是这里的关键 - 但我不确定如何做我需要做的事情?

基本上,我需要按 VisitationId 分组,并找到 max(BestillingId) 并从中获取日期。 我试过了

select
    dim.DW_SK_IndsatsDetaljer,
    dim.VisitationId as VisitationsId,
    max(dim.BestillingId) as BestillingId,
    dim.ServicePeriodeSlut as ServicePeriodeSlut
from nexus2.Dim_IndsatsDetaljer as dim
where DW_SK_IndsatsDetaljer = '3803872' or DW_SK_IndsatsDetaljer = '3803871'
group by    dim.DW_SK_IndsatsDetaljer,
    VisitationId,
    ServicePeriodeSlut

这给了我与上面相同的结果。

谁能指出我正确的方向?

2 个答案:

答案 0 :(得分:1)

实际上是我自己偶然发现的答案:

select
x.DW_SK_IndsatsDetaljer,
x.VisitationId,
max(x.BestillingId),
x.ServicePeriodeSlut
from (
        select
            f.VisitationId,
            max(f.BestillingId)
        from nexus2.Dim_IndsatsDetaljer as f
        group by VisitationId
    )

as y inner join nexus2.Dim_IndsatsDetaljer as x on x.VisitationId = y.VisitationId and x.BestillingId = y.BestillingId

所以基本上从简单查询的结果中选择我需要的内容来获取 MAX(BestillingId) 并将原始表与该结果连接起来。工作起来很有魅力,而且资源不是很重(“真正的”代码有大量的列,而不仅仅是 ServicePeriodeSlut 导致了问题)。

答案 1 :(得分:0)

使用 row_number() 窗口排名函数,您可以为每个访问 ID 选择具有最大 BestillingId 的行

with cte as 
(
select
    dim.DW_SK_IndsatsDetaljer,
    dim.VisitationId as VisitationsId,
    dim.BestillingId as BestillingId,
    dim.ServicePeriodeSlut as ServicePeriodeSlut,
    row_number()over(partition by VisitationsId  order by BestillingId  desc)rn   
from nexus2.Dim_IndsatsDetaljer as dim
where DW_SK_IndsatsDetaljer = '3803872' or DW_SK_IndsatsDetaljer = '3803871'
)
select     dim.DW_SK_IndsatsDetaljer,    VisitationsId,    BestillingId, ServicePeriodeSlut  f
rom cte where rn=1