Есть ли способ в SQL или Power BI, где я могу определять задания и вычислять время, необходимое для выполнения задания, а затем время между заданиями? - PullRequest
0 голосов
/ 06 августа 2020

В таблице ниже под lodnum указаны виды деятельности и уникальные идентификаторы. Я пытаюсь найти способ уменьшить разницу во времени между работой. Задание, такое как перемещение поддона, имеет две записи. Как вы можете видеть в строках 1 и 2, это перемещение поддона для поддона A. Представьте, что первая запись поднимает поддон, а вторая запись устанавливает его. Строки 3 и 4 - это отдельная работа, при которой поддон перемещается в другое место. Строки 7 и 9 - это тоже другая работа, иногда они пропускают несколько строк. Я хотел бы выяснить, сколько времени требуется каждому пользователю для выполнения каждой работы. А также время между каждым заданием для пользователя.

Как я могу сделать это в SQL или Power BI?

+---------+-----------------+--------+------+-------+-----+---------+--------+-------+
| Row Num |    activity     | usr_id | year | month | day |  time   | lodnum | wh_id |
+---------+-----------------+--------+------+-------+-----+---------+--------+-------+
|       1 | Pallet Move     | User1  | 2020 |     8 |   5 | 8:24:23 | A      | WH1   |
|       2 | Pallet Move     | User1  | 2020 |     8 |   5 | 8:24:30 | A      | WH1   |
|       3 | Pallet Move     | User2  | 2020 |     8 |   5 | 8:25:10 | A      | WH1   |
|       4 | Pallet Move     | User2  | 2020 |     8 |   5 | 8:25:14 | A      | WH1   |
|       5 | Pallet Move     | User1  | 2020 |     8 |   5 | 8:25:27 | B      | WH1   |
|       6 | Pallet Move     | User1  | 2020 |     8 |   5 | 8:25:30 | B      | WH1   |
|       7 | Inbound Putaway | User3  | 2020 |     8 |   6 | 4:19:58 | C      | WH2   |
|       8 | Inbound Putaway | User3  | 2020 |     8 |   6 | 4:19:59 | D      | WH2   |
|       9 | Inbound Putaway | User3  | 2020 |     8 |   6 | 4:22:05 | C      | WH2   |
|      10 | Inbound Putaway | User3  | 2020 |     8 |   6 | 4:22:10 | D      | WH2   |
|      11 | Trailer Load    | User1  | 2020 |     8 |   6 | 6:22:17 | E      | WH3   |
|      12 | Trailer Load    | User1  | 2020 |     8 |   6 | 6:22:23 | F      | WH3   |
|      13 | Trailer Load    | User1  | 2020 |     8 |   6 | 6:22:26 | E      | WH3   |
|      14 | Trailer Load    | User1  | 2020 |     8 |   6 | 6:22:30 | F      | WH3   |
+---------+-----------------+--------+------+-------+-----+---------+--------+-------+

1 Ответ

0 голосов
/ 06 августа 2020

Некоторые предположения:

  • Работа всегда начинается и заканчивается в один и тот же день? Важно для подсчета.
  • Уникальная комбинация activity / usr_id / year / month / lodnum / wh_id определяет «одну» работу

Сообщите нам, правильно ли это?

Возможное решение:

Сначала я построил CTE (Common Table Expression), который добавляет два столбца:

  1. столбец времени [Row], определяющий порядок заданий, на основе комбинации уникальных столбцов. Результаты в 1 и 2: начало и конец работы.
  2. [Ключ] создание ключа на основе комбинации уникальных столбцов для последующего соединения.

Во-вторых, я присоединяюсь к двум версии CTE: один с фильтром на [Row] = 1 (начало задания), который присоединяется ко второму на [Key] и [Row] = 2. Затем вычисляет разницу в секундах.

WITH CTE AS (
SELECT
       [activity]
      ,[usr_id]
      ,[year]
      ,[month]
      ,[day]
      ,[time]
      ,[lodnum]
      ,[wh_id]
      ,ROW_NUMBER() OVER (PARTITION BY activity, usr_id, year, month, day, lodnum, wh_id ORDER BY [time]) as [Row]
      ,RANK() OVER (ORDER BY activity, usr_id, year, month, day, lodnum, wh_id) as [Key]
  FROM [dbo].[JobActivities] )

  SELECT
     StartTime.usr_id, 
     StartTime.activity, 
     StartTime.day,
     StartTime.time as [Start Time],
     EndTime.time as [End Time],
     DATEDIFF(SECOND, StartTime.time, EndTime.time) as [Difference (s)]
  FROM
  CTE StartTime
  LEFT OUTER JOIN CTE EndTime ON StartTime.[Key] = EndTime.[Key] AND EndTime.Row = 2
  WHERE StartTime.Row = 1
  ORDER BY StartTime.day, StartTime.time

Решение 2. Использование LEAD (без соединения, лучшая производительность):

WITH CTE AS (
SELECT [Row Num]
      ,[activity]
      ,[usr_id]
      ,[year]
      ,[month]
      ,[day]
      ,[time] [Start Time]
      ,[lodnum]
      ,[wh_id]
      ,ROW_NUMBER() OVER (PARTITION BY activity, usr_id, year, month, day, lodnum, wh_id ORDER BY [time]) as [Row]
      ,LEAD([time]) OVER (PARTITION BY activity, usr_id, year, month, day, lodnum, wh_id ORDER BY [time]) AS [End Time]
  FROM [dbo].[JobActivities] )

  SELECT
     usr_id, 
     activity, 
     day,
     [Start Time],
     [End Time],
     DATEDIFF(SECOND, [Start Time], [End Time]) as [Difference (s)]
  FROM
  CTE
  WHERE Row = 1
 ORDER BY day, [Start Time]

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