使用分区计算SQL中的进程重复

问题描述 投票:0回答:2

仅供参考 - 我真的不确定提出这个问题的标题。任何指导都是最受欢迎的。

下面我有一个“父母”地毯(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之后放另一个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);

所以上面我试图在SQL中复制COUNTIFS(Excel)。 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

sql sql-server partitioning sql-server-2017
2个回答
0
投票

你可以使用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

1
投票

尝试使用以下方法

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
© www.soinside.com 2019 - 2024. All rights reserved.