2015-04-22 1 views
0

Хорошо, так что это может быть сложно объяснить.Как получить количество временных меток за первый час каждой смены?

То, что я пытаюсь сделать, - подсчитать количество загрузок в течение первого часа каждой смены. Я хочу сказать, что если загрузка начнется в 06:30, я хочу рассчитать количество загрузок с 06:30 до 07:00. Если загрузка началась с 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, что это самый простой способ сделать это?

Высокой оценки


Вот что присоединиться заявление выглядит как

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 
+1

Какой код соединения выглядит? –

+0

Просто добавили его на вопрос – james

ответ

0

Это больше псевдо-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 

Perh aps this ...

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 
+0

Ваш пример отличный, за исключением того, что он включает только N для shift_ident - я не могу понять, почему .. Любые идеи? – james

+0

Я узнал, что было не так в вышеупомянутом комментарии. Теперь он отлично работает! – james

Смежные вопросы