[英]SQL Grouping based on validity
我有下表,我們稱之為 tbl_costcenters,其中包含以下虛擬條目:
ID PosName CostcenterCode ValidFrom ValidUntil
1 test1 111 1.1.2019 1.6.2019
2 test1 111 1.6.2019 1.9.2019
3 test1 222 1.9.2019 1.6.2020
我會得到以下結果:
PosName ValidFrom ValidUntil CostcenterCode
test1 1.1.2019 1.9.2019 111
test1 1.9.2019 1.6.2020 222
這是非常簡化的。 真正的表包含更多的列。 我需要根據 costcentercode 對它們進行分組,並獲得包含我的示例的前兩個條目的有效性,從記錄 ID 1 返回 validfrom,從記錄 ID 2 返回 validuntil。
抱歉,我真的不知道要搜索什么。 我認為對於 SQL 的強者來說,答案很容易。
答案應該適用於 SQL 服務器和 Oracle。
謝謝您的幫助。
這似乎是簡單的聚合:
select PosName,
min(ValidFrom) as ValidFrom,
(case when max(ValidUntil) > min(ValidFrom) then max(ValidUntil) end) as ValidUntil,
CostcenterCode
from tbl_costcenters t
group by PosName, CostcenterCode;
我懷疑您想將日期重疊的記錄組合在一起,同時將不重疊的記錄分開(盡管這沒有顯示在您的示例數據中)。
如果是這樣,我們可以在這里使用一些間隙和島嶼技術。 一種選擇是使用 window 函數來構建相鄰記錄組:
select
postName,
min(validFrom) validFrom,
max(validUntil) validUntil
costCenter
from (
select
t.*,
sum(case when validFrom <= lagValidUntil then 0 else 1 end)
over(partition by posName, costCenter order by validFrom) grp
from (
select
t.*,
lag(validUntil)
over(partition by posName, costCenter order by validFrom) lagValidUntil
from mytable t
) t
) t
group by postName, costCenter, grp
order by postName, validFrom
對我來說,明確的解決方案是:
select posname, min(validfrom),
case
when
max(case when validuntil is null then 1 ELSE 0 END) = 0
then max(validuntil)
end
from tbl_costcenters pos
group by posname, costcentercode;
謝謝你們。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.