比较SQL Server中的两行并仅返回一行

时间:2016-03-11 16:11:14

标签: sql sql-server

我有一个表(行程),其中包含列的响应数据:

  • TripDate
  • 工作
  • 地址
  • DispatchDateTime
  • OnSceneDateTime
  • 车辆

通常两辆车会在同一天响应相同的地址,我需要找到那个首先出现的地址。

我试过这个:

SELECT 
  TripDate,
  Job,
  Vehicle,
  DispatchDateTime
  (SELECT min(OnSceneDateTime)
   FROM Trips AS FirstOnScene
   WHERE AllTrips.TripDate = FirstOnScene.TripDate
     AND AllTrips.Address = FirstOnScene.Address) AS FirstOnScene
FROM
  Trips AS AllTrips

但我仍然会返回两条记录,并且两者都有相同的FirstOnScene time

我如何只使用DispatchDateTimeOnSceneDateTime来获取记录,而不是第二个在场的行?

以下是表中的几个示例行:

2016-01-01 0169-a  150 Main St  2016-01-01 16:52  2016-01-01 16:59 Truck 1
2016-01-01 0171-a  150 Main St  2016-01-01 16:53  2016-01-01 17:05 Truck 2
2016-01-01 0190-a  29 Spring St 2016-01-01 17:19  2016-01-01 17:30 Truck 5
2016-01-02 0111-a  8 Fist St  2016-01-02 09:30  2016-01-02 09:40  Truck 1
2016-01-02 0112-a  8 Fist St  2016-01-02 09:32  2016-01-02 09:38  Truck 2

在上面的示例中,我需要返回该数据集的第一行,第三行和最后一行。

3 个答案:

答案 0 :(得分:2)

这是基于所提供的稀疏信息在黑暗中的总镜头。我真的不知道什么定义了给定的事件,所以你可以相应地调整分区。

with sortedValues as
(
    select TripDate
        , Job
        , Vehicle
        , OnSceneDateTime
        , ROW_NUMBER() over(partition by Address, DispatchDateTime order by OnSceneDateTime desc) as RowNum
    from Trips
)
select TripDate
    , Job
    , Vehicle
    , OnSceneDateTime
from sortedValues
where RowNum = 1

答案 1 :(得分:0)

您可以通过仅选择MIN OnSceneDateTime来过滤行,如下所示:

SELECT TripDate, Job, Vehicle, DispatchDateTime,OnSceneDateTime FirstOnScene
FROM Trips as AllTrips
WHERE AllTrips.OnSceneDateTime = (SELECT MIN(OnSceneDateTime) 
      FROM Trips as FirstOnScene
      WHERE AllTrips.TripDate = FirstOnScene.TripDate 
            and AllTrips.Address = FirstOnScene.Address
     )

答案 2 :(得分:-1)

如何在OnSceneDateTime上使用ORDER BY然后限制1.这样的简化版本:

SELECT TripDate, Job, Vehicle, DispatchDateTime, OnSceneDateTime FROM trips ORDER BY OnSceneDateTime LIMIT 1