Подсчет повторений процессов в SQL с использованием секционирования - PullRequest
0 голосов
/ 16 апреля 2019

К вашему сведению - я действительно не был уверен, какое название дать на этот вопрос. Любое руководство приветствуется.

Ниже у меня есть «родительский» коврик (A12345), который в конечном итоге разрезается на 2 или более коврика. Эти коврики должны пройти тщательную стирку, и мне нужно знать, сколько стирок прошел этот коврик между коврами «Родитель» и «Ребенок».

Таким образом, в общей сложности у «A12345-678» было 4 стирки, прежде чем он был разрезан, и затем 3 стирки после того, как он стал отдельным.

Используя порядковый номер, я должен иметь возможность пометить процесс как 1-й, 2-й, 3-й и т. Д. Поскольку столбец Process_Num является желаемым столбцом, которого я пытаюсь достичь в SQL.

Rug_Num Sequence_Num    Process Process_Num
A12345  10              Wash    1st Wash
A12345  11              Wash    2nd Wash
A12345  30              Wash    4th Wash
A12345  20              Wash    3rd Wash

 '----Rug cut into 2 child rugs'

A12345-678  40          Wash    5th Wash
A12345-678  50          Wash    6th Wash
A12345-678  60          Wash    7th Wash

A12345-997  40          Wash    5th Wash
A12345-997  50          Wash    6th Wash
A12345-997  60          Wash    7th Wash
A12345-997  70          Wash    8th Wash

Вот мое утверждение «в процессе», но я не могу понять, как добавить что-то после «THEN», что заставит его последовательно нумеровать текущую последовательность как «1st, 2nd, 3rd». Мой разум говорит поставить еще один COUNT CASE WHEN после 1-го THEN, но тогда это будет бесконечное утверждение.

WITH toupdate AS (
    SELECT m.*,
        count(CASE WHEN (m.Process = 'Wash' 
                        AND m.Rug_Num = m.Rug_Num
                        AND m.sequence_num < m.sequence_num)
                        THEN  1 ELSE 0 END)
         OVER (PARTITION BY m.Process, m.Rug_Num, m.Process_Num) AS Process_Num_New
         FROM mfng_data m
        )
    UPDATE toupdate
        SET Process_Num = ISNULL(Process_Num_New,0);

Итак, выше я пытался скопировать COUNTIFS (Excel) в SQL. Пример Excel ниже. Формула в столбце H:

=(COUNTIFS($C$3:$C$14,C3,$D$3:$D$14,"<"&D3,$E$3:$E$14,"Wash")+1)+IF(LEN(C3)>6,COUNTIFS($C$3:$C$14,$C$3,$E$3:$E$14,"Wash"),0)

Я добавляю +1, чтобы он считал, сколько было меньше текущей последовательности, и добавляю 1 для текущей последовательности.

Excel_Example

Ответы [ 2 ]

1 голос
/ 16 апреля 2019

Попробуйте использовать следующий способ

CREATE TABLE TestTable(
Rug_Num varchar(10),
Sequence_Num int,
Process varchar(10),
Process_Num int
)

INSERT TestTable(Rug_Num,Sequence_Num,Process)VALUES
 ('A12345',    10,'Wash')
,('A12345',    11,'Wash')
,('A12345',    30,'Wash')
,('A12345',    20,'Wash')
,('A12345-678',40,'Wash')
,('A12345-678',50,'Wash')
,('A12345-678',60,'Wash')
,('A12345-997',40,'Wash')
,('A12345-997',50,'Wash')
,('A12345-997',60,'Wash')
,('A12345-997',70,'Wash')


;WITH numCTE AS(
  SELECT Sequence_Num,ROW_NUMBER()OVER(ORDER BY Sequence_Num) Process_Num
  FROM
    (
      SELECT DISTINCT Sequence_Num
      FROM TestTable
    ) q
)
UPDATE t
SET
  t.Process_Num=n.Process_Num
FROM TestTable t
JOIN numCTE n ON t.Sequence_Num=n.Sequence_Num


SELECT *
FROM TestTable
0 голосов
/ 16 апреля 2019

Вы можете использовать count(*) с оконной функцией over()

В запросе ниже 2 count().Первый из них считается мойка нет для родителей, а второй count() на ребенка

select  *, 
        Wash_No = count (case when Parent_Rug = Rug_Num then 1 end) 
                   over (partition by Parent_Rug order by Sequence_num) 
                + count (case when Parent_Rug <> Rug_Num then 1 end)  
                   over (partition by Rug_Num order by Sequence_num)

from    mfng_data
...