以下查询:
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
这给了我与上面相同的结果。
谁能指出我正确的方向?
答案 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