Как перебирать подмножества таблицы в SQL - PullRequest
0 голосов
/ 13 июля 2020

Я новичок в SQL и буду признателен за любой совет!

У меня есть таблица, в которой хранится история заказов. Он включает в себя следующие столбцы: ORDERID, ORDERMILESTONE, NOTES, TIMESTAMP.

Один TIMESTAMP для каждого ORDERMILESTONE в ORDERID и наоборот.

Что я хочу сделать, так это сравнить TIMESTAMP с для некоторых ORDERMILESTONE с, чтобы получить количество времени, необходимое для go от начала до конца sh или от заказа до доставки и т. Д. c.

Чтобы получить это, мне нужно собрать все строки для определенного c ORDERID, а затем как-то перебрать их ... пока я пытался сделать это, объявив TVP для каждого ORDERID, но это займет больше времени, потому что некоторые из моих наборов данных имеют длину примерно 20000 строк.

Что вы порекомендуете? Заранее спасибо.

РЕДАКТИРОВАТЬ:

В моей задаче я хочу найти количество дней, которые заказ проводит в QA. Например, после размещения заказа нам нужно сделать запрошенный элемент и затем отправить его в QA. так что есть веха «Обработка» и веха «Обеспечение качества». Элемент может быть один раз в «Обработке», затем в «QA» и быть отправлен, или он может быть отправлен обратно в QA несколько раз, или назад и вперед между «Обработкой» и «Разработкой». Я хочу узнать общее количество времени, которое элемент проводит в QA.

Вот несколько примеров данных:

ORDERID | ORDERMILESTONE | ПРИМЕЧАНИЯ | TIMESTAMP 43 | Размещено | заказанная машина времени на заказ | 07-11-2020 12:00:00 43 | Обработка | первая сборка | 07-11-2020 13:00:05 43 | QA | отправлен в QA | 07-11-2020 13:30:12 43 | Инжиниринг | Инженерное дело ремонтирует кривошип на машине времени, пропускающей даже годы | 07-12-2020 13:00:02 43 | QA | Отправлено в отдел контроля качества для проверки новой рукоятки. Машина времени больше не должна пропускать даже годы. | 13.07.2020 16: 00: 18

0332AT | Размещено | световой меч на заказ из цветов радуги | 07-06-2020 01:00:09 0332AT | Обработка | световой меч строится | 07-06-2020 06:00:09 0332AT | QA | световой меч проходит испытания | 07-06-2020 06: 00: 09

Мне нужно общее количество дней, которые каждый заказ проводит с проверкой качества.

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

Ответы [ 3 ]

1 голос
/ 13 июля 2020

Чтобы получить количество часов для выполнения определенных c миль для всех заказов, вы можете выполнить

select orderid, 
       DATEDIFF(hh, min(TIMESTAMP), max(TIMESTAMP))
from your_table
where ORDERMILESTONE = 'mile stone name'
group by orderid
0 голосов
/ 13 июля 2020

Вы можете создать таблицу поиска, взяв веху и предоставив вам предыдущую веху. Затем вы можете присоединиться к нему слева и снова присоединиться к исходной таблице, чтобы получить строку для того же порядка на предыдущем этапе и сравнить даты ( sqlfiddle ):

select om.*, datediff(minute, pm.TIMESTAMP, om.TIMESTAMP) as [Minutes]
from OrderMilestones om
left join MilestoneSequence ms on ms.ORDERMILESTONE = om.ORDERMILESTONE
left join OrderMilestones pm on pm.ORDERID = om.ORDERID
      and pm.ORDERMILESTONE = ms.PREVIOUSMILESTONE
order by om.TIMESTAMP
0 голосов
/ 13 июля 2020

Предполагая, что вы используете SQL Сервер и ваши вехи не повторяются, вы можете использовать:

select om.orderid, 
       datediff(seconds, min(timestamp), max(timestamp))
from order_milestones om
where milestone in ('milestone1', 'milestone2')
group by om.orderid;

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

select om.*, 
       datediff(seconds,
                timestamp, 
                min(case when milestone = 'order' then timestamp end) over 
                    (partition by orderid
                     order by timestamp
                     rows between current row and unbounded following
                    )
               ) as time_to_order
from order_milestones om
group by om.orderid;
...