2016-10-31 6 views
0

Приветствую вас и счастливый Хэллоуин! Я использую SQL SERVER 2008 R2 на машине WIN7; У меня возникла проблема с попыткой разобрать некоторые данные и будет вызвана, если кто-нибудь сможет мне помочь в этом вопросе.Найдите минимальные и максимальные отметки времени для разных местоположений/серийных номеров, которые могут появляться более одного раза

Я приложил пример набора данных, который я пытаюсь уточнить. В этом наборе у меня есть 6 полей (это только подмножество гораздо большего набора), которые варьируются от имени, модели, местоположения, типа, серийного номера и даты-времени. В этом подмножестве поля имени и модели остаются постоянными, но изменяются поля местоположения, типа, серийного номера и даты.

То, что я пытаюсь достичь, это; для каждого местоположения я хотел бы знать минимальное и максимальное время «даты», связанное с каждым серийным номером, вместе с соответствующими полями, связанными с каждым кортежем, т. е. для каждого серийного номера я хотел бы знать минимальное и максимальное время вместе с местоположение/серийный номер/модель/имя для конкретного экземпляра серийного номера.

Это казалось прямым, но когда я понял, что серийный номер может быть удален и снова появится для того же места, мой запрос не удался. Сначала я попытался просто захватить минимальное и максимальное время для каждой отдельной комбинации серийного номера/местоположения, но это быстро дрогнуло, когда я обнаружил, что эти серийные номера не отображаются только один раз для каждого местоположения. В конце концов, я просто хотел бы узнать, как долго был установлен каждый серийный номер.

Я ценю любую помощь, благодарю заранее!

enter image description here

-Stelio K

+0

Пожалуйста, покажите свои попытки. –

+0

Я не могу, из-за характера моей работы я мог попасть в беду только для публикации этого. Я понимаю, если вы не хотите помогать, хотя. Thanks – StelioK

ответ

0

Вы можете сделать это с подзапросом. Sub-запрос на внутреннем соединении ограничит ваш результирующий набор записью, которая содержит максимальное значение DateTime для каждого серийного номера, как указано «для каждого серийного номера, который я хотел бы узнать о минимальном и максимальном времени, а также о местоположении/серийном номере/model/name для конкретного экземпляра серийного номера "

select 
    t.name, 
    t.model, 
    t.Location, 
    t.Type, 
    t.[Serial Number], 
    t2.DT as MaxDT, 
    NULL as MinDT 
from yourTable t 
inner join 
(select [serial number], max(DateTime) as DT 
from yourTable 
group by [serial number]) t2 on t2.[serial number] = t.[serial number] and t.DateTime = t2.DT 
UNION ALL 
select 
    t.name, 
    t.model, 
    t.Location, 
    t.Type, 
    t.[Serial Number], 
    NULL as MaxDT, 
    t2.DT as MinDT 
from yourTable t 
inner join 
(select [serial number], min(DateTime) as DT 
from yourTable 
group by [serial number]) t2 on t2.[serial number] = t.[serial number] and t.DateTime = t2.DT 
+0

Спасибо! К сожалению, это займет только максимальное время; если я также сделаю это для минут и присоединяюсь к тем временам, у меня будет только первый и последний раз, когда появится этот серийный номер. Иногда они снова появляются после удаления, поэтому я пытаюсь найти способ получить минимальное и максимальное время для каждого появления серийного номера в определенном месте. – StelioK

+0

А я пропустил эту часть. Вы можете сделать это с объединением all или partition на – scsimon

+0

Я уверен, что я могу просто не получить его, кроме как поблагодарить вас! – StelioK

0

Вы можете использовать функции агрегации над разделом, возможно, это работает на вас? Дополнительную информацию см. В документе OVER.

select a.NAME 
    , a.MODEL 
    , a.LOCATION 
    , a.[TYPE] 
    , a.SERIAL_NUMBER 
    , a.DATE_TIME 
    , Min(a.DATE_TIME) over (partition by a.LOCATION, a.SERIAL_NUMBER) MIN_DATE_TIME 
    , Max(a.DATE_TIME) over (partition by a.LOCATION, a.SERIAL_NUMBER) MAX_DATE_TIME 
from (values 
    (N'COMPANY', N'EI-MEX', N'12A', 'PAS-B', 2027, Convert(datetimeoffset(0), N'2014-10-03 04:04:21')) 
    , (N'COMPANY', N'EI-MEX', N'12A', 'PAS-B', 2027, Convert(datetimeoffset(0), N'2014-10-03 04:18:21')) 
    , (N'COMPANY', N'EI-MEX', N'16A', 'PAS-B', 2029, Convert(datetimeoffset(0), N'2014-10-02 03:57:25')) 
    , (N'COMPANY', N'EI-MEX', N'16A', 'PAS-B', 2029, Convert(datetimeoffset(0), N'2014-10-02 04:53:35')) 
    , (N'COMPANY', N'EI-MEX', N'19A', 'PAS-T', 499, Convert(datetimeoffset(0), N'2014-03-20 22:33:37')) 
    , (N'COMPANY', N'EI-MEX', N'19A', 'PAS-T', 499, Convert(datetimeoffset(0), N'2014-03-21 04:48:36')) 
    , (N'COMPANY', N'EI-MEX', N'19A', 'PAS-T', 499, Convert(datetimeoffset(0), N'2014-03-21 05:57:25')) 
    , (N'COMPANY', N'EI-MEX', N'19A', 'PAS-T', 499, Convert(datetimeoffset(0), N'2014-03-21 06:01:22')) 
    , (N'COMPANY', N'EI-MEX', N'19A', 'PAS-T', 499, Convert(datetimeoffset(0), N'2014-03-21 08:39:46')) 
    , (N'COMPANY', N'EI-MEX', N'19A', 'PAS-T', 499, Convert(datetimeoffset(0), N'2014-03-21 09:21:49')) 
    , (N'COMPANY', N'EI-MEX', N'19F', 'PAS-T', 2362, Convert(datetimeoffset(0), N'2014-03-11 14:01:42')) 
    , (N'COMPANY', N'EI-MEX', N'19F', 'PAS-T', 2362, Convert(datetimeoffset(0), N'2014-03-11 14:14:35')) 
) as a (NAME, MODEL, LOCATION, [TYPE], SERIAL_NUMBER, DATE_TIME); 
+0

Я попробую это, спасибо .. хорошая идея – StelioK

+0

Это очень близко и очень элегантно. Проблема в том, что для данного местоположения, если появляется серийный номер, удаляется и появляется снова, я не буду иметь эти промежуточные значения min и max только первые/последние экземпляры. Благодаря! – StelioK

+0

@StelioK Затем удалите отдельное предложение вверху и импортируйте поле DATE_TIME. Я обновил свой ответ, чтобы отразить это. – Kittoes0124

0

В случае, если кому-то интересно :) Я понял. Не стесняйтесь критиковать его, я был бы признателен:

SELECT * INTO #TEMP 
FROM MYTABLE; 

WITH ROW AS 
(
    SELECT * 
     , ROW_NUMBER() OVER (ORDER BY Name, model, location, [DATE TIME]) AS RN 
    FROM #temp 
) 
    SELECT DISTINCT R1.Name, R1.model, R1.Location, R1.TYPE 
      , r1.[SERIAL NUMBER], r1.[DATE TIME] 
      INTO #THEDELTAS 
       FROM ROW R1 
        JOIN ROW R2 
        ON ( R1.RN = R2.RN - 1 
           AND R1.NAME = R2.NAME 
           AND R1.model = R2.model 
           AND R1.LOCATION = R2.LOCATION 
           AND R1.[SERIAL NUMBER] <> R2.[SERIAL NUMBER]        
         ) 
         order by Name, model, location, [DATE TIME]; 
WITH ROW AS 
(
    SELECT * 
     , ROW_NUMBER() OVER (ORDER BY Name, model, location, [DATE TIME]) AS RN 
    FROM #temp 
) 
    SELECT DISTINCT R1.Name, R1.model, R1.Location, R1.TYPE 
      , r1.[SERIAL NUMBER], r1.[DATE TIME] 
      INTO #THEDELTAS2 
       FROM ROW R1 
        JOIN ROW R2 
        ON ( R1.RN = R2.RN + 1 
           AND R1.NAME = R2.NAME 
           AND R1.model = R2.model 
           AND R1.LOCATION = R2.LOCATION 
           AND R1.[SERIAL NUMBER] <> R2.[SERIAL NUMBER]        
         ) 
         order by Name, model, location, [DATE TIME]     

--GET MIN/MAX TIMES 
SELECT * INTO #TEMP2 
FROM 
( 
SELECT DISTINCT A.Name, A.model, A.Location, A.TYPE 
     , A.[SERIAL NUMBER] 
     , MIN(A.[DATE TIME]) [DATE TIME]     
       FROM #temp A 
    GROUP BY Name, model, location, TYPE, [SERIAL NUMBER] 
UNION  
SELECT DISTINCT A.Name, A.model, A.Location, A.TYPE 
     , A.[SERIAL NUMBER] 
     , MAX(A.[DATE TIME]) [DATE TIME]     
       FROM #temp A 
    GROUP BY Name, model, location, TYPE, [SERIAL NUMBER] 
    ) AS T 
ORDER BY Name, model, location, TYPE, [DATE TIME]  

SELECT * 
FROM (
SELECT * FROM #TEMP2 
UNION 
SELECT * FROM #THEDELTAS 
) AS T 
UNION 
SELECT * FROM #THEDELTAS2 
ORDER BY Name, model, location, TYPE, [DATE TIME] 

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

  • Нет связанных вопросов^_^