ID가

2014-06-08 3 views
0
인 복수 행의 단일 ID 값

ID가있는 테이블이 있으며 ID, 날짜 시간 seqno, 위도, 이벤트 유형 및 위치 (Google 위치)가 포함 된 이벤트 코드가 있습니다.ID가

고유 ID의 테이블에서 데이터를 가져 오려고합니다 (따라서 ID의 최신 datetime 만 값으로 사용). 그러나 최신 날짜 시간뿐만 아니라 모든 행을 계속 제공합니다.

distinct을 사용해 보았지만 작동하지 않습니다.

모든 데이터를 무시할 수 없어 표시해야합니다.

그러면 하위 쿼리를 사용하여 필요에 따라 값을 가져 옵니까?


내가 사용한 쿼리는 다음과 같습니다

Unit_id TransDate event_id EventDesc GeoLocation Latitude Longitude MsgSeqNo 
68217 2014-03-10 17:22 345 Battery Disconnect T3, Ndola, Zambia -12.96938333 28.62473333 1597114648 
68217 2014-03-17 15:01 345 Battery Disconnect 0|Position Invalid 0 0 1602601282 
68217 2014-03-18 05:37 345 Battery Disconnect 0|Position Invalid 0 0 1602976336 
69181 2014-04-03 11:02 345 Battery Disconnect Bowe Avenue, Mufulira, Zambia -12.53835 28.23953333 1616129719 
24555 2014-04-21 20:49 345 Battery Disconnect North Rand, Lethabong, South Africa -26.08998333 28.17598333 1629881440 
24555 2014-05-14 06:32 345 Battery Disconnect 17 Fountain Road, Lethabong (Ekurhuleni) 1609, South Africa -26.12955 28.15551667 1646144136 
24555 2014-05-14 06:33 345 Battery Disconnect 17 Fountain Road, Edenvale 1609, South Africa -26.1296 28.15568333 1646146148 
24555 2014-05-17 19:37 345 Battery Disconnect Mokgosi 1, Lobatse, Botswana -25.2317 25.66831667 1649274858 

답변

1

DISTINCT 키워드가 지정한 지정된 모든 열이 직접 후하지 첫 번째에 대해서는 다른 행에 대해 확인합니다. 당신이해야 할 일은 [Unit_id]에 의해 행을 파티션하고 [TransDate]에 따라 파티션을 주문하는 것입니다. 다음은 찾고있는 정보를 찾는 데 도움이됩니다. 단순화를 위해 세 개의 열만 추가했음을 유의하십시오. 그러나 모든 열 정의와 데이터가있는 나머지 열을 쉽게 추가 할 수 있어야합니다. 쿵 당신이 두 문장 사이에 문 분리 ;이 있는지 확인해야합니다 WITH 키워드를 사용하는 것을

DECLARE @Data TABLE (
    [Unit_id] INT, 
    [TransDate] DATETIME2(0), 
    [event_id] INT 
) 
INSERT INTO 
    @Data 
VALUES 
    (68217, '2014-03-10 17:22', 345), 
    (68217, '2014-03-17 15:01', 345), 
    (68217, '2014-03-18 05:37', 345), 
    (69181, '2014-04-03 11:02', 345), 
    (24555, '2014-04-21 20:49', 345), 
    (24555, '2014-05-14 06:32', 345), 
    (24555, '2014-05-14 06:33', 345), 
    (24555, '2014-05-17 19:37', 345) 

;WITH OrderedData AS (
    SELECT 
     [Unit_id], 
     [TransDate], 
     [event_id], 
     ROW_NUMBER() OVER (PARTITION BY [Unit_id] ORDER BY [TransDate] DESC) AS [Order] 
    FROM 
     @Data 
) 
SELECT 
    [Unit_id], 
    [TransDate], 
    [event_id] 
FROM 
    OrderedData 
WHERE 
    [Order] = 1 

참고.

+0

SQL에서 CTE를 잘 사용합니다. – celerno

1

나는 Unit_id를 가정하고있어 테이블에서 고유 :

SELECT Distinct[Unit_id] 
    ,[TransDate] 
    ,[event_id] 
    ,[EventDesc] 
    ,[GeoLocation] 
    ,[Latitude] 
    ,[Longitude] 
    ,[MsgSeqNo] 
FROM [bd].[dbo].[table] 

결과는 다음과 같다. 그러나 테이블에 또 다른 고유 한 복합 키가있을 수 있습니다. [GeoLocation, TransDate]가 고유 키일 수있는 GeoLocation을 가정합니다. 그럼 당신은 주어진 위치 정보가 실행될 최대 날짜 모든 레코드를 찾으려면 :

고유 키가 somehting 다른 경우
SELECT Unit_id] 
    ,[TransDate] 
    ,[event_id] 
    ,[EventDesc] 
    ,[GeoLocation] 
    ,[Latitude] 
    ,[Longitude] 
    ,[MsgSeqNo] 
FROM [Ibd].[dbo].[table] x 
WHERE TransDate = (SELECT MAX(TransDate) 
         FROM [Ibd].[dbo].[table] 
         WHERE GeoLocation = x.GeoLocation) 

후, 그에 따라 수정해야 가입 할 수 있습니다. 샘플 데이터와 의견을 바탕으로

업데이트

:

SELECT Unit_id] 
    ,[TransDate] 
    ,[event_id] 
    ,[EventDesc] 
    ,[GeoLocation] 
    ,[Latitude] 
    ,[Longitude] 
    ,[MsgSeqNo] 
FROM [Ibd].[dbo].[table] x 
WHERE MsgSeqNo= (SELECT MAX(MsgSeqNo) 
        FROM [Ibd].[dbo].[table] 
        WHERE Unit_id= x.Unit_id) 

그냥 최대 시퀀스를 사용하는 것이 가장 최근의 기록을 의미하지 않습니다, 그것은 단지와 관련된 가장 높은 일련 번호를 의미한다 Unit_id. 신중하게 당신의 구조와 당신이 정말로 원하는 것을 고려하십시오.

+0

예 Unit_ID와 MsgSeqNo가 고유 한 경우 동일한 위치에서 여러 번 발생할 수 있거나 때때로 변경 될 수 있으므로 주소가 항상 변경되는 것은 아닙니다. transdate와 MsgSeqNo는 둘 다 항상 고유해야하지만 시간에 중복 된 transdate 항목이 있으므로 사용하는 것이 가장 좋습니다. – user3676496

+0

감사합니다. 나는 쿼리를 시도하고 필요한 결과를 얻는 데 필요한만큼 수정하는 방법을 보게됩니다. – user3676496

0

는 사용하십시오 JOIN :

SELECT T1.Unit_id, T1.TransDate, T1.event_id, T1.EventDesc, T1.GeoLocation, 
     T1.Latitude, T1.Longitude, T1.MsgSeqNo 
    FROM [bd].[dbo].[table] T1 
     JOIN (SELECT Unit_id, MAX(TransDate) as TransDate 
       FROM [bd].[dbo].[table] 
       GROUP BY Unit_id) T2 
      ON T1.Unit_id = T2.Unit_id AND T1.TransDate = T2.TransDate