Как сгруппировать набор записей (т.е. в цикл выставления счетов / выставления счетов) - PullRequest
1 голос
/ 18 мая 2019

Для набора записей этапа счета по проекту я пытаюсь определить цикл выставления счетов, используя идентификатор начальной стадии счета.

Вот таблица - InvoiceStages

|ID| Project | StageDate | InvoiceStage            | StageFlag | BillCycle |
|1 | abc123  | 10-May-18 | Finance                 |     S     |    1      |
|2 | abc123  | 15-May-18 | Review Draft            |           |    1      |
|4 | abc123  | 19-May-18 | Approved - NO Changes   |           |    1      |
|7 | abc123  | 21-May-18 | Final Invoice           |     E     |    1      |
|9 | abc123  | 05-Jun-18 | Finance                 |     S     |    9      |
|12| abc123  | 07-Jun-18 | Review Draft            |           |    9      |
|15| abc123  | 09-Jun-18 | Approved - With Changes |           |    9      |
|21| abc123  | 10-Jun-18 | Review Draft            |           |    9      |
|25| abc123  | 12-Jun-18 | Approved - NO Changes   |           |    9      |
|40| abc123  | 13-Jun-18 | Final Invoice           |     E     |    9      |
|3 | xyz789  | 15-May-18 | Finance                 |     S     |    3      |
|5 | xyz789  | 19-May-18 | Review Draft            |           |    3      |
|6 | xyz789  | 20-May-18 | Approved - NO Changes   |           |    3      |
|8 | xyz789  | 22-May-18 | Final Invoice           |     E     |    3      |
|10| xyz789  | 06-Jun-18 | Finance                 |     S     |    10     |
|11| xyz789  | 07-Jun-18 | Review Draft            |           |    10     |
|18| xyz789  | 09-Jun-18 | Approved - NO Changes   |           |    10     |
|22| xyz789  | 11-Jun-18 | Final Invoice           |     E     |    10     |

Я смотрел на LAG / LEAD, но не был уверен, будет ли это лучшим вариантом.

Select
    ID
    , Project
    , StageDate
    , InvoiceStage
    , StageFlag
    , ?? As BillCycle
From InvoiceStages

Я ожидаю, что выходные данные для BillCycle будут идентификатором первой записи, где StageFlag = 'S' для всех записей до и включая конечную стадию 'E'.Затем начнется следующий набор с идентификатором, начинающимся с 'S'.

1 Ответ

0 голосов
/ 18 мая 2019

Вы можете назначить группу, используя накопленную сумму, а затем использовать оконную функцию, чтобы получить значение:

select i.*,
       max(id) over (partition by project, grp) as invoice_id
from (select i.*,
             sum(case when i.stageflag = 'S' then 1 else 0 end) over (partition by i.project order by i.stagedate) as grp
      from InvoiceStages i
     ) i;

Если идентификаторы увеличиваются вместе с датой, вы можете сделать это без подзапроса:

select i.*,
       max(case when stageflag = 'S' then id end) over (partition by project) as invoice_id
from invoicestages i;
...