SQL Группировка на основе срока действия - PullRequest
1 голос
/ 30 апреля 2020

У меня есть следующая таблица, назовем ее 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

Это очень упрощено , Настоящая таблица содержит гораздо больше столбцов. Мне нужно сгруппировать их на основе кода costcenter и получить действительность, которая объединяет две первые записи моего примера, возвращая validfrom из идентификатора записи 1 и validuntil из идентификатора записи 2.

Извините, я действительно не знал что искать. Я думаю, что ответ прост для кого-то, кто силен в SQL.

Ответ должен работать как для SQL Сервера, так и для Oracle.

Спасибо за помощь.

Ответы [ 3 ]

1 голос
/ 30 апреля 2020

Это кажется простой агрегацией:

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; 
0 голосов
/ 30 апреля 2020

Определенным решением для меня было:

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;

Спасибо всем.

0 голосов
/ 30 апреля 2020

Я подозреваю, что вы хотите сгруппировать записи, чьи даты перекрываются, при этом разделив те, которые не перекрываются (хотя это не отражено в ваших данных примера).

Если это так, мы могли бы использовать некоторые методы пробелов и островов здесь. Одна опция использует оконные функции для построения групп смежных записей:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...