具有ID' s的多行中的单个ID值

时间:2014-06-08 16:06:03

标签: sql tsql

我有一个包含值的表,它有一个ID,日期时间seqno,lat long,事件类型和带位置的事件代码(Google位置)。

我正在尝试从不同ID的表中提取数据(因此只将ID上的最新日期时间作为值),但它不断向我提供所有行,而不仅仅是最新的日期时间。

我尝试使用distinct,但它无效。

我无法忽略必须全部显示的任何数据。

这会导致使用子查询来获取所需的值吗?


我使用的查询是:

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

结果如下:

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

3 个答案:

答案 0 :(得分:1)

我假设Unit_id在表格中是唯一的。但表中可能还有另一个独特的复合键。我将假设GeoLocation,在这种情况下,[GeoLocation,TransDate]可能是唯一的密钥。然后,您要查找具有给定GeoLocation的最大日期的所有记录:

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关联的最高序列号。仔细考虑你的结构和你真正想要的东西。

答案 1 :(得分:1)

DISTINCT关键字将检查您指定的所有指定列的不同行,而不是后面的第一个。您必须做的是按[Unit_id]对行进行分区,并根据[TransDate]对分区进行排序。以下内容将帮助您找到所需的信息。请注意,为了简单起见,我只添加了三列,但您应该很容易添加包含所有列定义和数据的其余列。

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

请注意,使用WITH关键字,必须确保两个语句之间存在语句分隔符;

答案 2 :(得分: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