我有一个包含值的表,它有一个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
答案 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