2016-10-31 3 views
0

안녕하세요, 행복한 할로윈! WIN7 컴퓨터에서 SQL Server 2008 R2를 사용하고 있습니다. 누군가가이 문제로 나를 도울 수있는 경우 일부 데이터를 구문 분석하려고 일부 문제가 발생했습니다.두 번 이상 나타날 수있는 고유 한 위치/일련 번호에 대한 최소 및 최대 날짜 - 시간 스탬프 찾기

나는 조금 더 세분화하려는 데이터 세트의 예를 첨부했다. 이 세트에서 이름, 모델, 위치, 유형, 일련 번호 및 날짜 - 시간 범위의 6 개 필드 (훨씬 더 큰 세트의 하위 세트 만 있음)가 있습니다. 이 하위 세트에서 이름 및 모델 필드는 계속 유지되지만 위치, 유형, 일련 번호 및 날짜 필드는 변경됩니다.

내가 달성하려고하는 것은 이것입니다. 모든 위치에 대해 각 일련 번호와 연관된 해당 필드와 함께 최소 및 최대 "날짜 시간"을 알고 싶습니다. 예 : 모든 일련 번호에 대해 최소 및 최대 시간을 알고 싶습니다. 특정 일련 번호 인스턴스의 위치/일련 번호/모델/이름.

이것은 직설적 인 것처럼 보였지만 일련 번호가 제거되어 동일한 위치에 대해 다시 나타날 수 있다는 것을 깨달았을 때 쿼리가 실패했습니다. 먼저 모든 일련 번호/위치 조합에 대해 최소 및 최대 시간을 간단하게 시도했지만 이러한 일련 번호가 모든 위치에 대해 단 한번만 나타나지는 않았을 때 신속하게 약화되었습니다. 결국 각 일련 번호가 얼마나 오래 설치되었는지 알고 싶습니다.

감사합니다. 미리 감사드립니다.

enter image description here

-Stelio K는

+0

시도해보십시오. –

+0

내 작품의 성격 때문에 나는 이것을 게시하기 만하면 곤란할 수 있습니다. 너를 도와주고 싶지 않으면 이해해. 감사합니다 – StelioK

답변

0

당신은 하위 쿼리와 함께이 작업을 수행 할 수 있습니다. 내부 조인에 대한 하위 쿼리는 결과 집합을 각 일련 번호에 대한 최대 DateTime을 포함하는 레코드로 제한합니다. "모든 일련 번호에 대해 위치 및 일련 번호와 함께 최소 및 최대 시간을 알고 싶습니다./모델/특정 특정 일련 번호 인스턴스의 이름 "

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

아 나는 그 부분을 놓쳤다. 당신은 노조 전체 또는 파티션으로이 작업을 수행 할 수 있습니다. – 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

이것은 매우 가깝고 매우 우아하다. 이 문제는 특정 위치에 대해 일련 번호가 나타나면 제거되고 다시 나타나는 중간 및 최소 값은 첫 번째/마지막 인스턴스 만 표시되지 않습니다. 감사! – StelioK

+0

@StelioK 그런 다음 상단에있는 distinct 절을 제거하고'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]