【问题标题】:How do I retrieve a count of timestamps over the first hour of each shift?如何在每个班次的第一个小时内检索时间戳计数?
【发布时间】:2015-06-30 08:34:57
【问题描述】:

好的,所以这个可能很难解释..

我要做的是计算每个班次第一个小时内的负载数量。我的意思是如果加载从 0630 开始,我想计算从 0630 到 0700 完成加载的次数。如果从 0705 开始加载,则计数将从 0705 到 0800 等等。

到目前为止,这是我必须使用的:

SELECT est.shift_date
    ,CASE est.shift_ident
        WHEN '1' THEN 'D'
        WHEN '2'THEN 'N'
        END AS shift_ident
    ,min(est.start_timestamp) AS start
FROM equip_status_trans est
JOIN equip_status_code esc ON esc.status_code est.status_code
WHERE est.shift_date >= (getdate() - 180)
    AND esc.status_desc 'LU Loading'
    AND est.equip_ident IN (
        'S803'
        ,'S804'
        )
GROUP BY est.shift_date
    ,est.shift_ident
    ,est.equip_ident

忽略过滤器,我得到的是日期、班次标识和每个班次加载的开始时间戳。

我也有

SELECT est.shift_date
    ,CASE est.shift_ident
        WHEN '1' THEN 'D'
        WHEN '2' THEN 'N'
        END AS shift_ident
    ,count(est.end_timestamp) AS count
    ,min(est.start_timestamp) AS start
FROM equip_status_trans est
JOIN equip_status_code esc ON esc.status_code = est.status_code
WHERE est.shift_date >= (getdate() - 180)
    AND esc.status_desc = 'LU Loading'
    AND est.equip_ident IN (
        'S803'
        ,'S804'
        )
GROUP BY est.shift_date
    ,est.shift_ident
    ,est.equip_ident
    ,datepart(hh, est.end_timestamp)

它为我提供了日期、班次标识、加载的开始时间戳以及每小时的加载次数。开始时间戳是每小时的最小加载时间戳,而不是每个班次的最小时间戳。

我遇到的问题是,每次我尝试加入两者时,它都会返回轮班期间每小时的负载计数,而不仅仅是第一个小时。

作为 SQL Server 的新手,最简单的方法是什么?

非常感谢


join 语句如下所示

 SELECT est.shift_date, 
    CASE est.shift_ident 
        WHEN '1' THEN 'D' 
        WHEN '2' THEN 'N' 
        END as shift_ident, 
    min(est.start_timestamp) as start
    , est.equip_ident, d1.count
FROM  equip_status_trans est 
join equip_status_code esc on esc.status_code = est.status_code 
left outer join
    (SELECT est2.shift_date, 
        CASE est2.shift_ident 
            WHEN '1' THEN 'D' WHEN '2' THEN 'N' 
            END as shift_ident
        , count(est2.end_timestamp) as count
        , min(est2.start_timestamp) as start
        , est2.equip_ident
    FROM equip_status_trans est2 
    join equip_status_code esc2 on esc2.status_code = est2.status_code
    WHERE est2.shift_date >= (getdate() - 180) 
        and esc2.status_desc = 'LU Loading' 
        and est2.equip_ident IN('S803', 'S804')
    GROUP BY est2.shift_date
        , est2.shift_ident
        , est2.equip_ident
        , datepart(hh, est2.end_timestamp)
    )d1 on est.start_timestamp = d1.start
WHERE est.shift_date >= (getdate() - 180) 
and esc.status_desc = 'LU Loading' 
and est.equip_ident IN('S803', 'S804')
GROUP BY est.shift_date, est.shift_ident, est.equip_ident, d1.count

【问题讨论】:

  • 加入代码是什么样的?
  • 刚刚添加到问题中

标签: sql-server join time count min


【解决方案1】:

这更像是一种伪 SQL,它抽象出一些与连接和过滤器无关的选择数据,但我相信你会想要这样的东西:

WITH START_TIME_PER_SHIFT AS
(/*select statement that gives you the minimum start per shift */)

SELECT EST.SHIFT_DATE,
       COUNT(EST.END_TIMESTAMP) AS COUNT,
       ST_TIME.START AS START
  FROM EQUIP_STATUS_TRANS EST
  JOIN START_TIME_PER_SHIFT ST_TIME
    ON EST.SHIFT_DATE = ST_TIME.SHIFT_DATE
   AND DATEPART(hh, EST.END_TIMESTAMP) =
       DATEPART(hh, EST.SHIFT_DATE) --get the next hour from the shift start; only join records that are within that first hour
 GROUP BY EST.SHIFT_DATE ST_TIME.START

也许这...

WITH START_TIME_PER_SHIFT AS
 (SELECT est.shift_date,
         CASE est.shift_ident
           WHEN '1' THEN
            'D'
           WHEN '2' THEN
            'N'
         END AS shift_ident,
         /*est.equip_ident, (did you need this grouping as well?)*/
         min(est.start_timestamp) AS start
    FROM equip_status_trans est
    JOIN equip_status_code esc
      ON esc.status_code est.status_code
   WHERE est.shift_date >= (getdate() - 180)
     AND esc.status_desc 'LU Loading'
     AND est.equip_ident IN ('S803', 'S804')
   GROUP BY est.shift_date, est.shift_ident
  /*,est.equip_ident*/
  )

SELECT est.shift_date,
       CASE est.shift_ident
         WHEN '1' THEN
          'D'
         WHEN '2' THEN
          'N'
       END AS shift_ident,
       /*est.equip_ident, (did you need this grouping as well?) */
       count(est.end_timestamp) AS count,
       st_time.start AS start
  FROM equip_status_trans est
  JOIN START_TIME_PER_SHIFT st_time
    ON est.shift_date = st_time.shift_date
   AND CASE est.shift_ident WHEN '1' THEN 'D' WHEN '2' THEN 'N' END = st_time.shift_ident
 /*AND est.equip_ident = st_time.equip_ident*/
  JOIN equip_status_code esc
    ON esc.status_code = est.status_code
 WHERE est.shift_date >= (getdate() - 180)
   AND datepart(hh, est.shift_date) = datepart(hh, est.end_timestamp)
   AND esc.status_desc = 'LU Loading'
   AND est.equip_ident IN ('S803', 'S804')
 GROUP BY est.shift_date, est.shift_ident, /*est.equip_ident,*/ st_time.start

【讨论】:

  • 您的示例很棒,只是它只包含 shift_ident 的 N - 我似乎无法弄清楚为什么......有什么想法吗?
  • 我发现上面的评论出了什么问题。现在效果很好!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-09-24
  • 1970-01-01
  • 2018-10-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多