测试数据
VINNumber ChannelID TimeStamp
604356ad-54da-4155-afb1-5 01 2015-05-27 10:57:00
604356ad-54da-4155-afb1-5 03 2015-05-27 10:42:00
604356ad-54da-4155-afb1-5 05 2015-05-27 10:43:00
604356ad-54da-4155-afb1-5 04 2015-05-27 10:50:00
604356ad-54da-4155-afb1-5 02 2015-05-27 10:77:00
dcadaed8-af22-4602-b85b-f 01 2015-05-27 11:56:00
dcadaed8-af22-4602-b85b-f 03 2015-05-27 11:53:00
dcadaed8-af22-4602-b85b-f 02 2015-05-27 11:54:00
dcadaed8-af22-4602-b85b-f 04 2015-05-27 11:55:00
dcadaed8-af22-4602-b85b-f 05 2015-05-27 11:56:00
53089042-ed6c-480f-acc8-c 01 2015-05-27 12:57:00
53089042-ed6c-480f-acc8-c 02 2015-05-27 12:57:00
分组条件:
1.以字段 TimeStamp 倒序排序
2.以字段 VINNumber 分组
2.以字段 ChannelID 顺序排序
分组排序后的数据:
VINNumber ChannelID TimeStamp
53089042-ed6c-480f-acc8-c 01 2015-05-27 12:57:00
53089042-ed6c-480f-acc8-c 02 2015-05-27 12:57:00
dcadaed8-af22-4602-b85b-f 01 2015-05-27 11:56:00
dcadaed8-af22-4602-b85b-f 02 2015-05-27 11:53:00
dcadaed8-af22-4602-b85b-f 03 2015-05-27 11:54:00
dcadaed8-af22-4602-b85b-f 04 2015-05-27 11:55:00
dcadaed8-af22-4602-b85b-f 05 2015-05-27 11:56:00
604356ad-54da-4155-afb1-5 01 2015-05-27 10:57:00
604356ad-54da-4155-afb1-5 02 2015-05-27 10:42:00
604356ad-54da-4155-afb1-5 03 2015-05-27 10:43:00
604356ad-54da-4155-afb1-5 04 2015-05-27 10:50:00
604356ad-54da-4155-afb1-5 05 2015-05-27 10:77:00
从结果集来看,并不需要用到分组,写法:
select * from t order by t.TimeStamp DESC,t.VINNumber,t.ChannelID
依据你的查询SQL 结果查询到的数据
2015-05-27 11:01:00 09ff8127-54e1-40e2-899c-d 02
2015-05-27 11:01:00 09ff8127-54e1-40e2-899c-d 03
2015-05-27 11:01:00 09ff8127-54e1-40e2-899c-d 04
2015-05-27 11:01:00 09ff8127-54e1-40e2-899c-d 05
2015-05-27 11:00:00 09ff8127-54e1-40e2-899c-d 01
2015-05-27 10:57:00 53089042-ed6c-480f-acc8-c 01
2015-05-27 10:57:00 53089042-ed6c-480f-acc8-c 02
2015-05-27 10:57:00 53089042-ed6c-480f-acc8-c 03
2015-05-27 10:57:00 53089042-ed6c-480f-acc8-c 04
2015-05-27 10:57:00 53089042-ed6c-480f-acc8-c 05
@Me_Code: 专门加了个表测试。
1. 第一步根据VINNumber排序(而不是分组)
2. 第二不ChannelID排序
3. TimeStamp 最后加入排序。
SELECT * FROM `t_jeff` j ORDER BY j.VINNumber,j.ChannelID,j.TimeStamp DESC
@罗玉虎:
你好,问题是解决了。但是我想请教一下,这个 SQL 的排序机制
ORDER BY j.VINNumber,j.ChannelID,j.TimeStamp DESC 的执行顺序
@罗玉虎:
1. 第一步根据VINNumber排序(而不是分组)
2. 第二不ChannelID排序
3. TimeStamp 最后加入排序。
SELECT * FROM `t_jeff` j ORDER BY j.VINNumber,j.ChannelID,j.TimeStamp DESC
这个答案是错误的。刚才数据有问题
实际数据如下:
2015-05-27 10:57:00 01 53089042-ed6c-480f-acc8-c
2015-05-27 10:57:00 02 53089042-ed6c-480f-acc8-c
2015-05-27 10:57:00 03 53089042-ed6c-480f-acc8-c
2015-05-27 10:57:00 04 53089042-ed6c-480f-acc8-c
2015-05-27 10:57:00 05 53089042-ed6c-480f-acc8-c
2015-05-27 10:56:00 01 604356ad-54da-4155-afb1-5
2015-05-27 10:56:00 02 604356ad-54da-4155-afb1-5
2015-05-27 10:56:00 03 604356ad-54da-4155-afb1-5
2015-05-27 10:56:00 04 604356ad-54da-4155-afb1-5
2015-05-27 10:56:00 05 604356ad-54da-4155-afb1-5
2015-05-27 11:00:00 01 99ff8127-54e1-40e2-899c-d
2015-05-27 11:01:00 02 99ff8127-54e1-40e2-899c-d
2015-05-27 11:01:00 03 99ff8127-54e1-40e2-899c-d
2015-05-27 11:01:00 04 99ff8127-54e1-40e2-899c-d
2015-05-27 11:01:00 05 99ff8127-54e1-40e2-899c-d
2015-05-27 10:56:00 01 dcadaed8-af22-4602-b85b-f
2015-05-27 10:56:00 02 dcadaed8-af22-4602-b85b-f
2015-05-27 10:56:00 03 dcadaed8-af22-4602-b85b-f
2015-05-27 10:56:00 04 dcadaed8-af22-4602-b85b-f
2015-05-27 10:56:00 05 dcadaed8-af22-4602-b85b-f
@Me_Code: 怎么错了呢, 我看不出来。 就你给我的实际数据来说,正确的话应该是怎样
@Me_Code: sql 排序优先级是:从前面到后面一直往下
@罗玉虎:
排序从前往后,所有你的 SQL 一开始就错了。
我的要求的排序方式是:
1.组内成员的排序以字段 ChannelID
2.组的排序以字段 TimeStamp DESC
3.分组方式以 VINNumber
我刚才自己都被绕晕了。
排序前的测试数据:
VINNumber ChannelID TimeStamp
Group3 2 2015年5月27日
Group2 1 2015年5月23日
Group1 5 2015年5月25日
Group2 3 2015年5月29日
排序分组排序后的数据:
VINNumber ChannelID TimeStamp
Group2 1 2015年5月23日
Group2 3 2015年5月29日
Group3 2 2015年5月27日
Group1 5 2015年5月25日
@Me_Code: 测试前和测试后的数据,是以什么规则来的。 我完全看不出来。
@罗玉虎:
1.组 内成员的排序以字段 ChannelID
2.组 的排序方式以组中字段 MAX( TimeStamp )倒序排列
3.分组方式以 VINNumber
@Me_Code:
SELECT i.* FROM(
SELECT VINNumber,MIN(j.ChannelID) AS a FROM `t_jeff` j GROUP BY j.VINNumber ORDER BY MIN(j.ChannelID)
) m
INNER JOIN t_jeff i ON i.VINNumber=m.VINNumber ORDER BY m.a,i.VINNumber,i.TimeStamp ;
mysql测试通过
@罗玉虎:
你是否用的这个数据
VINNumber ChannelID TimeStamp
Group3 2 2015年5月27日
Group2 1 2015年5月23日
Group1 5 2015年5月25日
Group2 3 2015年5月29日
@Me_Code:
@Me_Code:
SELECT i.* FROM(
SELECT VINNumber,max(j.ChannelID) AS a FROM t_jeff j GROUP BY j.VINNumber
) m
INNER JOIN t_jeff i ON i.VINNumber=m.VINNumber ORDER BY m.a desc ,i.VINNumber, i.ChannelID desc;
这是mssql的写法
可以拆分成两步,先倒序排列timestamp,然后再执行2跟3
select row_number() over( PARTITION BY VINNumber order by TimeStamp desc,ChannelID ) rid, * from table
1 2015-05-27 11:01:00 02 09ff8127-54e1-40e2-899c-d
2 2015-05-27 11:01:00 03 09ff8127-54e1-40e2-899c-d
3 2015-05-27 11:01:00 04 09ff8127-54e1-40e2-899c-d
4 2015-05-27 11:01:00 05 09ff8127-54e1-40e2-899c-d
5 2015-05-27 11:00:00 01 09ff8127-54e1-40e2-899c-d
1 2015-05-27 10:57:00 01 53089042-ed6c-480f-acc8-c
2 2015-05-27 10:57:00 02 53089042-ed6c-480f-acc8-c
3 2015-05-27 10:57:00 03 53089042-ed6c-480f-acc8-c
4 2015-05-27 10:57:00 04 53089042-ed6c-480f-acc8-c
5 2015-05-27 10:57:00 05 53089042-ed6c-480f-acc8-c
你的 SQL 中 让 TimeStamp 与 ChannelID 排序时,就是错误的。
1 2015-05-27 11:01:00 02 09ff8127-54e1-40e2-899c-d
2 2015-05-27 11:01:00 03 09ff8127-54e1-40e2-899c-d
3 2015-05-27 11:01:00 04 09ff8127-54e1-40e2-899c-d
4 2015-05-27 11:01:00 05 09ff8127-54e1-40e2-899c-d
5 2015-05-27 11:00:00 01 09ff8127-54e1-40e2-899c-d
1 2015-05-27 10:57:00 01 53089042-ed6c-480f-acc8-c
2 2015-05-27 10:57:00 02 53089042-ed6c-480f-acc8-c
3 2015-05-27 10:57:00 03 53089042-ed6c-480f-acc8-c
4 2015-05-27 10:57:00 04 53089042-ed6c-480f-acc8-c
5 2015-05-27 10:57:00 05 53089042-ed6c-480f-acc8-c
你的 SQL 中 让 TimeStamp 与 ChannelID 排序时,就是错误的。
当 TimeStamp 与 ChannelID 中的值不一样时,排序默认以你放在排序中的先后顺序决定的。
也就是你放在前面的 TimeStamp 决定最终的排序结果
例:
TimeStamp = 2015-05-27 11:00:00 和 ChannelID =01
与
TimeStamp = 2015-05-27 11:01:00 和 ChannelID =02