【问题标题】:Get count of how many batch from parcels made in every hour of the day计算一天中每个小时的包裹数量
【发布时间】:2021-09-15 15:03:30
【问题描述】:

我对@9​​87654322@、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 BYDISTINCT 时,这始终是缺陷的标志。 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


【解决方案1】:

我相信以下内容可以获得您想要的结果。它仍在每小时计算不同批次,但排除您不想计算的批次,因为它们不会在当前小时内结束。日期范围拟合与问题无关,您可以在必要时添加。

select DatePart(hour, dt) hr, Count(distinct batch_no) batch_count
from manufacturing m
    where not exists (
        select * from manufacturing m2 
        where m2.parcel_id=m.parcel_id 
            and m2.batch_no=m.batch_no 
            and DatePart(hour, m2.dt)>DatePart(hour, m.dt)
    )
group by DatePart(hour, dt)

【讨论】:

  • 我真的很感激帮助,但似乎有问题。我正在添加日期范围并获得另一个查询以获取每个 parcel_id 的总数,我很确定它会输出正确的值。但是这个答案给我的比它应该的要少。所以看起来它传递了一些值。 prnt.sc/1sk6r3t
【解决方案2】:

你似乎在描述:

SELECT parcel_id, DATEPART(hour, rh.dt), COUNT(DISTINCT rh.batch_no)
FROM manufacturing rh
WHERE rh.dt >= CONVERT(DATE, GETDATE()) AND
      rh.dt < DATEADD(DAY, 1, CONVERT(DATE, GETDATE()))
GROUP BY rh.parcel_id, DATEPART(hour, rh.dt);

注意对日期比较所做的简化。

【讨论】:

  • 感谢您对日期比较的澄清。我不知道你能做到这一点。我想答案离我需要的只有一步之遥。这是我从查询中得到的结果:prnt.sc/1senywx 如您所见,有两个小时。我需要它更像这样:prnt.sc/1seobyh 我确实尝试从 select 和 group by 中删除 parcel_id,它实际上给了我我需要的东西:prnt.sc/1seogt3 但是有一个错误。在 dt 列结合 8 将给出 8 个批次计数,但是当我删除 parcel_id 时,我得到 7。我想我错过了一些东西。
  • @Reotte 。 . .您的查询尝试包括parcel_id,因此相对于问题而言,这似乎很重要。您的问题应该真正包括样本数据和期望的结果。
  • 是的,但不是获取包裹ID,而是获取包裹ID和批号组合的唯一编号,因为我不知道该怎么做。我知道它的愚蠢尝试。还包括样本数据和期望的结果。
【解决方案3】:

我想出了自己的解决方案,并且看起来完美无缺。我所做的是按包裹和批次分组,所以我只得到 1 个 parcel_id 和所有批次编号中的一个,以及它们的最大小时数。

然后从这个查询中,我按小时对结果进行分组,同时计算该小时有多少批次。这给了我完美的预期结果。

SELECT grp.dt, COUNT(grp.batch_no) batch_count
FROM (
     SELECT MAX(DATEPART(HOUR, dt)) dt, batch_no
     FROM manufacturing
          WHERE dt >= CONVERT(DATE, GETDATE())
     GROUP BY parcel_id, batch_no
     ) grp
GROUP BY grp.dt

也感谢您指出更简单的日期时间比较并澄清 GROUP BYDISTINCT 子句。

【讨论】:

    猜你喜欢
    • 2023-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-10
    • 2020-09-15
    • 2019-11-02
    • 1970-01-01
    • 2015-04-11
    相关资源
    最近更新 更多