【发布时间】:2014-01-31 01:20:23
【问题描述】:
我正在尝试填充此数据以构建按产品类型划分的每小时输出。基本上每条线上可以运行3类产品。它可以每小时更换 4 次,但有时一个产品会运行一整天。
Line Product Hour ProductStopped TimeStamp HourCount
1 A 7 2014-01-28 07:56:30.000 2014-01-28 07:52:47.000 222
1 A 7 2014-01-28 07:56:30.000 2014-01-28 07:53:52.000 225
1 A 7 2014-01-28 07:56:30.000 2014-01-28 07:54:57.000 297
1 B 7 2014-01-28 08:05:20.000 2014-01-28 07:54:57.000 297
1 A 7 2014-01-28 07:56:30.000 2014-01-28 07:55:59.000 321
1 B 7 2014-01-28 08:05:20.000 2014-01-28 07:55:59.000 321
1 B 7 2014-01-28 08:05:20.000 2014-01-28 07:57:02.000 332
1 B 7 2014-01-28 08:05:20.000 2014-01-28 07:58:08.000 364
1 B 7 2014-01-28 08:05:20.000 2014-01-28 07:59:14.000 420
1 B 8 2014-01-28 08:05:20.000 2014-01-28 08:00:16.000 456
1 B 8 2014-01-28 08:05:20.000 2014-01-28 08:01:19.000 489
1 B 8 2014-01-28 08:05:20.000 2014-01-28 08:02:22.000 523
1 B 8 2014-01-28 08:05:20.000 2014-01-28 08:03:25.000 589
1 A 8 NULL 2014-01-28 08:03:25.000 589
1 B 8 2014-01-28 08:05:20.000 2014-01-28 08:04:30.000 634
1 A 8 NULL 2014-01-28 08:04:30.000 634
1 B 8 2014-01-28 08:05:20.000 2014-01-28 08:05:35.000 678
1 A 8 NULL 2014-01-28 08:05:35.000 678
1 A 8 NULL 2014-01-28 08:06:39.000 720
1 A 8 NULL 2014-01-28 08:07:45.000 745
HourCount 是从班次开始(早上 7 点)开始生产的零件数量,并将计算到班次结束(晚上 7 点)。如果产品从 A 变为 B,HourCount 仍然继续,因为它与产品无关,而是与机器有关。我想知道每个产品每小时生产多少。 我希望这张表看起来像这样:
Line Product Hour Quantity
1 A 7 321
1 B 7 78
1 C 7 0 (or without this row if is 0 for the product)
1 A 8 56
1 B 8 346
........
2 A 7 533
2 B 7 43
....
我添加了新列 ProductStopped,其中记录了产品停止输出时的日期和时间,不幸的是我无法添加何时开始,因为这将解决我的所有问题:) 我稍微修改了@OGHaza 解决方案,它给了我几乎正确的值,我现在遇到的问题是当 ProductStopped 为 NULL 时(仍在运行)。
WITH cte AS (
SELECT t1.*
,CASE WHEN t1.Stop >
(SELECT top 1 Stop
FROM t t2
WHERE t1.TimeStamp = t2.TimeStamp
AND t1.LineID = t2.LineID
AND t1.Hour = t2.Hour
AND t1.Product <> t2.Product
AND t1.HourCount = t2.HourCount
ORDER BY TimeStamp
)
OR t1.Stop IS NULL
THEN 0
ELSE 1
END AS InProduction
FROM t t1
)
SELECT LineID
,Product
,Hour
,SUM(CASE WHEN PrevInProduction = 1
THEN HourCount - PrevCount
ELSE 0
END) AS Units
FROM (SELECT t1.*
,(SELECT top 1 InProduction
FROM cte t2
WHERE t2.TimeStamp < t1.TimeStamp
AND t1.Product = t2.Product
AND t1.LineID = t2.LineID
ORDER BY TimeStamp DESC
) AS PrevInProduction
,(SELECT top 1 HourCount
FROM cte t2
WHERE t2.TimeStamp < t1.TimeStamp
AND t1.Product = t2.Product
AND t1.LineID = t2.LineID
ORDER BY TimeStamp DESC
) AS PrevCount
FROM cte t1
) t1
GROUP BY LineID, Hour, Product
ORDER BY LineID, Hour, Product
非常感谢
【问题讨论】:
-
我无法弄清楚您数据的第 3-7 行发生了什么。第 2 行 = +3A,第 3 行 = +72A,然后呢?
-
好的,机器可以同时运行两个产品,但是这个产品只有一个在输出。所以在第 4 行产品 B 已经开始但尚未输出。第 5 行产品 A 结束,第 6-7 行产品 B 开始输出。产品 B 的数据应从 6 开始计数(产品 B 应读取为 0)。
-
2014-01-28 07:58:02.000条目的计数为 332,2014-01-28 07:57:06.000为 364?有可能还是那里有错字? -
另外,您想要的 Line 1 Product B Hour 7 输出中的 78 应该反映数据样本还是随机数?假设 389 是 Line 1 Hour 7 的最后一次计数,我希望它是 68。
-
@Andriy M,我已经更新了表格,因为它是一个错字。我还在表格顶部添加了更多数据。另一个表只是一个随机值。
标签: sql sql-server sql-server-2008-r2