簡體   English   中英

SQL 基於有效性分組

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM