2017-03-04 38 views
0

我用这个SQL在同一行同时显示:如何选择Min和下一步敏和相关查询

/****** Select Min and Next Min with Bike ID ******/ 
SELECT 
t.[bike_id] 
,min(t.[start_date]) as Min_Date 
,(SELECT min([start_date]) From trip Where [start_date] > (SELECT min([start_date]) From trip)) as Next_Min_Date 
FROM [dbo].[trip] t 
Group By t.[bike_id] 
Having t.[bike_id] < '15' 

,得到了这样的结果:

+---------+-------------------------+-------------------------+ 
| bike_id | Min_Date    | Next_Min_Date   | 
+---------+-------------------------+-------------------------+ 
| 9  | 2013-08-29 12:02:00.000 | 2013-08-29 09:24:00.000 | 
| 10  | 2013-09-01 13:47:00.000 | 2013-08-29 09:24:00.000 | 
| 11  | 2013-08-29 20:11:00.000 | 2013-08-29 09:24:00.000 | 
| 12  | 2013-08-30 17:15:00.000 | 2013-08-29 09:24:00.000 | 
| 13  | 2013-08-29 10:13:00.000 | 2013-08-29 09:24:00.000 | 
| 14  | 2013-08-31 11:55:00.000 | 2013-08-29 09:24:00.000 | 
+---------+-------------------------+-------------------------+ 

显然子查询是不相关的 - 但我不知道如何使这是一个相关子查询

我想要的是下一个最小值对于每个自行车ID不只是第二最小值在ta ble

回答

1

您可以使用row_number来执行此操作。

select [bike_id], 
max(case when rnum=1 then t.[start_date] end) as min_date, 
max(case when rnum=2 then t.[start_date] end) as next_min_date 
from (
SELECT 
t.*,row_number() over(partition by t.[bike_id] order by t.[start_date]) as rnum 
FROM [dbo].[trip] t 
) x 
group by [bike_id] 
+0

谢谢 - 所以我试了这个,它的工作。大!你能否指点一些资源来解释/分割你的代码?仅供参考,它抱怨了很多关于多部分标识符,所以我不得不把它们全部从你的答案中拿出来供未来的人看... – kiltannen

+0

你知道一个资源,它解释了** Over(Partition ** part你的select语句正在工作吗?我想了解这段代码实际上是如何工作的:) – kiltannen

+0

该文档是启动https://msdn.microsoft.com/en-us/library/ms186734.aspx的好地方 –