【发布时间】:2021-09-15 15:03:30
【问题描述】:
我对@987654322@、GROUP BY 子句感到非常困惑,无法理解我需要做什么才能获得我想要的值。
我的表(简体)
CREATE TABLE manufacturing
(
[id] [int] IDENTITY(1,1) NOT NULL,
[dt] [datetime] NOT NULL,
[parcel_id] [int] NULL,
[batch_no] [int] NULL,
[tn] [int] NULL
)
GO
每个 parcel_id 的 batch_no 1 到 'anything' 和 batch_no 的 tn 1 到 'anything' 所以它们不是固定的最大数量。
当机器完成一个步骤 (tn) 时,它会将其写入 DB
我需要每小时在数据库中获取多少批次(从 0 到 24)
一个批次可以在 15:00 开始并在 17:00 结束,我需要将其写入 17。
我尝试的是
SELECT
COUNT(parcel_batch) AS batch_count, dt
FROM
(SELECT
parcel_batch as parcel_batch, MAX(dt) as dt
FROM
(SELECT DISTINCT(CONVERT(varchar, parcel_id) + CONVERT(varchar, batch_no)) as parcel_batch, DATEPART(HOUR, dt) as dt
FROM manufacturing
WHERE DATEPART(YEAR, dt) = 2021
AND DATEPART(MONTH, dt) = 09
AND DATEPART(DAY, dt) = 15
AND fabrika = 2) AS qq
GROUP BY
parcel_batch) AS new
GROUP BY
dt
我在第一个查询(第 3 行)中尝试的是结合 parcel 和 batch 可以给我唯一的编号,这样我就可以 DISTINCT。起初它似乎对我的测试值有效。然后我在真实的数据库上使用它(它要大得多)它没有正确给出。
我今天的总批次是这样的
SELECT DISTINCT rh.parcel_id, CONVERT(varchar, MIN(rh.dt)), CONVERT(varchar, MAX(rh.dt)), MAX(rh.batch_no) FROM manufacturing as rh
WHERE DATEPART(YEAR, rh.dt) = DATEPART(YEAR, GETDATE())
AND DATEPART(MONTH, rh.dt) = DATEPART(MONTH, GETDATE())
AND DATEPART(DAY, rh.dt) = DATEPART(DAY, GETDATE())
GROUP BY rh.parcel_id
但是真的不知道如何获得每小时多少批次,因为我无法理解 DISTINCT(我猜它需要 SELECT 之后的所有内容,我认为只有第一个或其他东西)或 GROUP BY
提前致谢。
更新:
这就是我的数据的样子。
BEGIN TRANSACTION
INSERT INTO manufacturing VALUES(CONVERT(datetime,'2021-09-15 00:03:00.000'), 290, 1, 45)
INSERT INTO manufacturing VALUES(CONVERT(datetime,'2021-09-15 00:05:00.000'), 290, 1, 48)
INSERT INTO manufacturing VALUES(CONVERT(datetime,'2021-09-15 00:34:00.000'), 290, 2, 44)
INSERT INTO manufacturing VALUES(CONVERT(datetime,'2021-09-15 00:47:00.000'), 291, 1, 58)
INSERT INTO manufacturing VALUES(CONVERT(datetime,'2021-09-15 00:54:00.000'), 291, 1, 43)
INSERT INTO manufacturing VALUES(CONVERT(datetime,'2021-09-15 00:58:00.000'), 291, 1, 43)
INSERT INTO manufacturing VALUES(CONVERT(datetime,'2021-09-15 01:02:00.000'), 291, 1, 2)
INSERT INTO manufacturing VALUES(CONVERT(datetime,'2021-09-15 01:08:00.000'), 291, 1, 41)
INSERT INTO manufacturing VALUES(CONVERT(datetime,'2021-09-15 01:24:00.000'), 291, 2, 46)
INSERT INTO manufacturing VALUES(CONVERT(datetime,'2021-09-15 01:36:00.000'), 291, 2, 47)
INSERT INTO manufacturing VALUES(CONVERT(datetime,'2021-09-15 01:58:00.000'), 291, 3, 2)
INSERT INTO manufacturing VALUES(CONVERT(datetime,'2021-09-15 02:04:00.000'), 291, 3, 42)
INSERT INTO manufacturing VALUES(CONVERT(datetime,'2021-09-15 02:23:00.000'), 291, 3, 52)
INSERT INTO manufacturing VALUES(CONVERT(datetime,'2021-09-15 02:54:00.000'), 292, 1, 57)
INSERT INTO manufacturing VALUES(CONVERT(datetime,'2021-09-15 02:55:00.000'), 292, 1, 53)
INSERT INTO manufacturing VALUES(CONVERT(datetime,'2021-09-15 02:59:00.000'), 292, 2, 48)
INSERT INTO manufacturing VALUES(CONVERT(datetime,'2021-09-15 03:12:00.000'), 292, 2, 45)
INSERT INTO manufacturing VALUES(CONVERT(datetime,'2021-09-15 03:15:00.000'), 292, 2, 44)
INSERT INTO manufacturing VALUES(CONVERT(datetime,'2021-09-15 03:22:00.000'), 292, 3, 51)
INSERT INTO manufacturing VALUES(CONVERT(datetime,'2021-09-15 03:46:00.000'), 293, 1, 58)
INSERT INTO manufacturing VALUES(CONVERT(datetime,'2021-09-15 03:55:00.000'), 293, 1, 2)
INSERT INTO manufacturing VALUES(CONVERT(datetime,'2021-09-15 04:24:00.000'), 293, 2, 2)
INSERT INTO manufacturing VALUES(CONVERT(datetime,'2021-09-15 04:33:00.000'), 293, 2, 2)
INSERT INTO manufacturing VALUES(CONVERT(datetime,'2021-09-15 04:45:00.000'), 294, 1, 2)
INSERT INTO manufacturing VALUES(CONVERT(datetime,'2021-09-15 04:46:00.000'), 294, 1, 57)
INSERT INTO manufacturing VALUES(CONVERT(datetime,'2021-09-15 04:58:00.000'), 294, 1, 1)
INSERT INTO manufacturing VALUES(CONVERT(datetime,'2021-09-15 05:23:00.000'), 295, 1, 1)
INSERT INTO manufacturing VALUES(CONVERT(datetime,'2021-09-15 05:32:00.000'), 295, 1, 53)
INSERT INTO manufacturing VALUES(CONVERT(datetime,'2021-09-15 05:35:00.000'), 295, 2, 51)
INSERT INTO manufacturing VALUES(CONVERT(datetime,'2021-09-15 05:38:00.000'), 295, 3, 1)
INSERT INTO manufacturing VALUES(CONVERT(datetime,'2021-09-15 05:43:00.000'), 296, 1, 52)
INSERT INTO manufacturing VALUES(CONVERT(datetime,'2021-09-15 05:47:00.000'), 296, 1, 52)
INSERT INTO manufacturing VALUES(CONVERT(datetime,'2021-09-15 05:49:00.000'), 296, 1, 52)
INSERT INTO manufacturing VALUES(CONVERT(datetime,'2021-09-15 06:45:00.000'), 296, 1, 2)
INSERT INTO manufacturing VALUES(CONVERT(datetime,'2021-09-15 06:47:00.000'), 296, 2, 2)
INSERT INTO manufacturing VALUES(CONVERT(datetime,'2021-09-15 06:53:00.000'), 296, 2, 2)
INSERT INTO manufacturing VALUES(CONVERT(datetime,'2021-09-15 06:56:00.000'), 296, 2, 3)
INSERT INTO manufacturing VALUES(CONVERT(datetime,'2021-09-15 06:58:00.000'), 296, 3, 7)
INSERT INTO manufacturing VALUES(CONVERT(datetime,'2021-09-15 07:26:00.000'), 296, 3, 1)
INSERT INTO manufacturing VALUES(CONVERT(datetime,'2021-09-15 07:35:00.000'), 296, 4, 1)
INSERT INTO manufacturing VALUES(CONVERT(datetime,'2021-09-15 07:42:00.000'), 296, 5, 43)
INSERT INTO manufacturing VALUES(CONVERT(datetime,'2021-09-15 07:46:00.000'), 296, 5, 43)
SELECT * FROM manufacturing
COMMIT TRANSACTION
我需要上表的输出:
-------------------
| dt | batch_count|
-------------------
| 0 | 2 |
| 1 | 2 |
| 2 | 2 |
| 3 | 3 |
| 4 | 2 |
| 5 | 3 |
| 6 | 2 |
| 7 | 3 |
-------------------
总计 18 除以小时。
【问题讨论】:
-
GROUP BY 结合 SELECT DISTINCT?!?
-
我认为我们需要忽略您的查询尝试,为清楚起见,根据Minimal, Reproducible Example在您的问题中包含实际样本数据和预期结果@
-
要详细说明@jarlh 的困惑,当您在同一范围内有
GROUP BY和DISTINCT时,这始终是缺陷的标志。GROUP BY将;已经将您的数据放入 distinct 组中。这要么意味着您的GROUP BY是错误的,并且将您的数据分成了太多组(因此需要解决和修复),或者DISTINCT是完全多余的,只会造成不必要的开销。在 both 情况下,DISTINCT应该被删除。对于您的 SQL,这看起来像后者。 -
@Reotte 我不明白您的预期结果,例如您希望 01:00 小时计数为 2,您的样本数据在这一小时内有 3 个不同的 batch_no,为什么计数为 2 而不是3?
-
@Reotte 好的,感谢您的澄清。在这种情况下,我可以得到你想要的结果,除了第 4 小时 - parcel_id 293 batch 2 和 parcel_id 294 batch 1 都只存在于这个小时,所以这是 2 个批次,而不是 1 个?
标签: sql sql-server tsql