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

时间:2019-04-16 04:24:17

标签: sql sql-server partitioning sql-server-2017

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

下面我有一个“母”地毯(A12345),该地毯最终被切成2个或更多地毯。这些地毯需要经过严格的清洗,我需要知道该地毯在“父母”和“儿童”地毯之间经过了多少次清洗。

因此,“ A12345-678”总共被切割前要洗4次,然后在分开后再洗3次。

使用序列号,我必须能够将进程标记为1st,2nd,3rd等。使用Process_Num列作为我想要在SQL中实现的期望列。

WHERE 
**exists
(select * from [FN_RPT_CommaSeperated_Kiosk] (@KioskId,',') where [String] = TD.CaseId)**

这是我的“进行中”语句,但是我无法弄清楚如何在“ THEN”之后添加一些内容,这将导致它按顺序将当前序列编号为“ 1st,2nd,3rd”。我的想法是在第一个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 之后再加上一个COUNT CASE WHEN,但这将是一个无限的陈述。

THEN

因此,以上我试图在SQL中复制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); (Excel)。 Excel示例如下。 H列中的公式为:

COUNTIFS

我加+1,这样就可以计算出比当前序列少多少,并为当前序列加1。

Excel_Example

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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