группировка с помощью FIRSTVALUE () / LAST_VALUE () - PullRequest
3 голосов
/ 16 мая 2019

У меня есть данные транзакции по времени.У него есть несколько рабочих номеров.Иногда номера заданий делятся на две части, между которыми выполняется еще одно задание.Я хотел бы сообщить об этих разделенных заданиях в двух разных строках со своей собственной статистикой.

Я пробовал несколько различных оконных решений, кажется, что FIRST_VALUE() и LAST_VALUE() - мои лучшие варианты.Я хотел бы, чтобы время первой и последней транзакции задания было доступно в столбцах, чтобы я мог затем сгруппировать их и показать количество транзакций.

Когда я их использую, хотя я делю работу по заданию, LastKit и FirstKit действуют так, как будто я сделал группу.Я надеюсь сгруппировать, но с заданием разбить его на части.

select  FIRST_VALUE(DTIMECRE) OVER(PARTITION BY job  ORDER BY dtimecre) AS KitStart,
LAST_VALUE(DTIMECRE)  OVER(PARTITION BY job  ORDER BY dtimecre 
  ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING) AS KitEnd,
count(*) as QtyKitted
from transactions
order by dtimecre

    KitStart            KitEnd                  Job    dtimecre 
                                                          SystemicLocation
    5/15/19 11:00:07    5/15/19 15:17:20    978437  5/15/19 11:00:07    3
    5/15/19 11:00:07    5/15/19 15:17:20    978437  5/15/19 11:00:08    3
    5/15/19 11:00:07    5/15/19 15:17:20    978437  5/15/19 11:00:09    3
    5/15/19 11:00:07    5/15/19 15:17:20    978437  5/15/19 11:00:10    3
    5/15/19 11:00:07    5/15/19 15:17:20    978437  5/15/19 11:00:10    3
    5/15/19 11:00:07    5/15/19 15:17:20    978437  5/15/19 11:00:11    3
    5/15/19 11:00:07    5/15/19 15:17:20    978437  5/15/19 11:00:12    3
    5/15/19 11:00:07    5/15/19 15:17:20    978437  5/15/19 11:00:13    3
    5/15/19 11:00:07    5/15/19 15:17:20    978437  5/15/19 11:00:13    3
    5/15/19 11:00:07    5/15/19 15:17:20    978437  5/15/19 11:00:14    3
    5/15/19 11:00:07    5/15/19 15:17:20    978437  5/15/19 11:00:15    3
    5/15/19 11:00:07    5/15/19 15:17:20    978437  5/15/19 11:00:16    3
    5/15/19 11:00:07    5/15/19 15:17:20    978437  5/15/19 11:00:46    3
    5/15/19 11:00:07    5/15/19 15:17:20    978437  5/15/19 11:00:47    3
    5/15/19 11:00:07    5/15/19 15:17:20    978437  5/15/19 11:00:48    3
    5/15/19 11:00:07    5/15/19 15:17:20    978437  5/15/19 11:00:49    3
    5/15/19 11:00:07    5/15/19 15:17:20    978437  5/15/19 11:00:49    3
    5/15/19 11:06:17    5/15/19 11:14:11    979309  5/15/19 11:06:17    3
    5/15/19 11:06:17    5/15/19 11:14:11    979309  5/15/19 11:12:16    3
    5/15/19 11:06:17    5/15/19 11:14:11    979309  5/15/19 11:12:26    3
    5/15/19 11:06:17    5/15/19 11:14:11    979309  5/15/19 11:12:32    3
    5/15/19 11:06:17    5/15/19 11:14:11    979309  5/15/19 11:12:39    3
    5/15/19 11:06:17    5/15/19 11:14:11    979309  5/15/19 11:12:45    3
    5/15/19 11:06:17    5/15/19 11:14:11    979309  5/15/19 11:13:38    3
    5/15/19 11:06:17    5/15/19 11:14:11    979309  5/15/19 11:13:45    3
    5/15/19 11:06:17    5/15/19 11:14:11    979309  5/15/19 11:13:50    3
    5/15/19 11:06:17    5/15/19 11:14:11    979309  5/15/19 11:13:55    3
    5/15/19 11:06:17    5/15/19 11:14:11    979309  5/15/19 11:14:00    3
    5/15/19 11:06:17    5/15/19 11:14:11    979309  5/15/19 11:14:06    3
    5/15/19 11:06:17    5/15/19 11:14:11    979309  5/15/19 11:14:11    3
    5/15/19 11:00:07    5/15/19 15:17:20    978437  5/15/19 11:35:51    3
    5/15/19 11:00:07    5/15/19 15:17:20    978437  5/15/19 11:35:51    3
    5/15/19 11:00:07    5/15/19 15:17:20    978437  5/15/19 11:35:52    3
    5/15/19 11:00:07    5/15/19 15:17:20    978437  5/15/19 11:36:23    3
    Lots of transactions……              
    5/15/19 11:00:07    5/15/19 15:17:20    978437  5/15/19 15:17:19    3
    5/15/19 11:00:07    5/15/19 15:17:20    978437  5/15/19 15:17:19    3
    5/15/19 11:00:07    5/15/19 15:17:20    978437  5/15/19 15:17:20    3

Просмотр данных: первый KitStart - 11:00:07, затем выполняется транзакция в11:06:17 когда появится следующая работа (979309).Но это возвращается к 11:00:07, когда работа 978437 начинается снова.Я хотел бы, чтобы это был первый раз в этом блоке комплектации, поэтому 11: 35: 51.

Та же проблема с LAST_VALUE.В первой транзакции это 15:17:20, что является окончанием второго раунда задания 978437. Я хочу, чтобы оно было 11: 00: 49.

Подводя итог, я ищу,это будет выглядеть так:

    KitStart            KitEnd              Job    QtyKitted
    5/15/19 11:00:07    5/15/19 15:17:20    978437  17
    5/15/19 11:06:17    5/15/19 11:14:11    979309  13
    5/15/19 11:35:51    5/15/19 15:17:20    978437  1007

Это показывает, что задание 978437 было запущено, запущено 17 единиц, переключено на задание 979309, выполнено 13, затем переключено обратно на 978437 и запущено 1007 единиц.

Кроме того, это мой первый пост по SQL-серверу (и второй по счету), спасибо за то, что согласился с любыми несоответствиями к сообщениям Stackoverflow, у меня, вероятно, есть пара.Спасибо!

Ответы [ 2 ]

1 голос
/ 18 мая 2019

Я нашел ответ благодаря Группировать последовательные строки одного и того же значения, используя промежутки времени

Я добавил еще один столбец (Ranker), чтобы создать отдельные группы для каждого непоследовательного появления prod_idсо временем.

with A as (
    select prod_id, sku, dtimecre, systemiclocation,
    prevProd_id = lag(prod_id, 1, prod_id)  over (order by dtimecre)
    from transactions
),
B as  (
    select prod_id, sku, dtimecre, systemiclocation,
    Ranker = SUM(CASE WHEN prod_id = Prevprod_id THEN 0 ELSE 1 END)
                OVER (order by dtimecre)
    FROM   A
    )

select prod_id, sku, min(dtimecre) as KitStart, max(dtimecre) as KitEnd from B
group by prod_id, sku, Ranker
order by min(dtimecre)

Произведено:

prod_id KitStart                    KitEnd                       QtyKittted
978437  2019-05-15 11:00:07.0000000 2019-05-15 11:00:49.0000000 17
979309  2019-05-15 11:06:17.0000000 2019-05-15 11:14:11.0000000 13
978437  2019-05-15 11:35:51.0000000 2019-05-15 15:17:20.0000000 1007
0 голосов
/ 16 мая 2019

Вопрос несколько сбивает с толку, но мне кажется, что вы хотите MIN (KitStart) и MAX (KitEnd) для каждого задания, независимо от прерываний.В этом случае запрос GROUP BY должен удовлетворять этим требованиям.

SELECT MIN(DTIMECRE) AS KitStart,
       MAX(DTIMECRE) AS KitEnd,
       job, 
       sku,  
       SystemicLocation 
FROM transactions
GROUP BY job, 
sku,   
SystemicLocation 
ORDER BY dtimecre

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

Чтобы обойти эту проблему, я бы предложил использовать общие табличные выражения (CTE).Я предполагаю, что Job является уникальным идентификатором, и вы не будете повторно использовать номер работы для более чем одной работы.Если нет, вы можете изменить запрос самостоятельно.

WITH MINDTimeCRE AS
(SELECT MIN(DTIMECRE) DTIMECRE,
       Job
       FROM transactions
       GROUO BY Job)
,MAXDTimeCRE AS 
(SELECT MAX(DTIMECRE) DTIMECRE,
       Job
       FROM transactions
       GROUP BY Job)
SELECT MINDTimeCRE.DTIMECRE KitStart,
       MAXDTimeCRE.DTIMECRE AS KitEnd,
       job, 
       sku,  
       DTIMECRE,
       SystemicLocation 
FROM transactions
  LEFT JOIN MINDTimeCRE 
  ON transactions.Job = MINDTimeCRE.Job
    LEFT JOIN MAXDTimeCRE 
    ON transactions.Job = MAXDTimeCRE.Job

Это будет рассматривать первые два оператора SELECT в запросе почти так же, как если бы они были таблицами, и после присоединения этих CTE к запросу с помощью LEFT JOIN выможет запрашивать их, как если бы они были столбцами, не требуя агрегирования.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...