首页新闻找找看学习计划

SQL SERVER 2008 先排序,再分组,再排序 在线等。。。

0
悬赏园豆:100 [已解决问题] 解决于 2015-05-27 15:16

测试数据

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

Me_Code的主页 Me_Code | 初学一级 | 园豆:52
提问于:2015-05-27 13:15
< >
分享
最佳答案
0

从结果集来看,并不需要用到分组,写法:

select * from t order by t.TimeStamp DESC,t.VINNumber,t.ChannelID

收获园豆:100
Jerry柯 | 菜鸟二级 |园豆:496 | 2015-05-27 13:57

依据你的查询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 | 园豆:52 (初学一级) | 2015-05-27 14:03

@Me_Code: 专门加了个表测试。

1. 第一步根据VINNumber排序(而不是分组)

2. 第二不ChannelID排序

3. TimeStamp 最后加入排序。 

SELECT * FROM `t_jeff` j ORDER BY j.VINNumber,j.ChannelID,j.TimeStamp DESC

Jerry柯 | 园豆:496 (菜鸟二级) | 2015-05-27 15:00

@罗玉虎: 

你好,问题是解决了。但是我想请教一下,这个 SQL 的排序机制

ORDER BY j.VINNumber,j.ChannelID,j.TimeStamp DESC 的执行顺序

Me_Code | 园豆:52 (初学一级) | 2015-05-27 15:14

@罗玉虎:

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 | 园豆:52 (初学一级) | 2015-05-27 15:26

@Me_Code: 怎么错了呢, 我看不出来。 就你给我的实际数据来说,正确的话应该是怎样

Jerry柯 | 园豆:496 (菜鸟二级) | 2015-05-27 15:39

@Me_Code: sql 排序优先级是:从前面到后面一直往下

Jerry柯 | 园豆:496 (菜鸟二级) | 2015-05-27 15:41

@罗玉虎: 

排序从前往后,所有你的 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 | 园豆:52 (初学一级) | 2015-05-27 16:02

@Me_Code: 测试前和测试后的数据,是以什么规则来的。 我完全看不出来。 

Jerry柯 | 园豆:496 (菜鸟二级) | 2015-05-27 16:12

@罗玉虎: 

1.组 内成员的排序以字段 ChannelID

2.组 的排序方式以组中字段 MAX( TimeStamp )倒序排列

3.分组方式以 VINNumber

Me_Code | 园豆:52 (初学一级) | 2015-05-27 16:24

@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测试通过

Jerry柯 | 园豆:496 (菜鸟二级) | 2015-05-27 16:34

@罗玉虎: 

你是否用的这个数据

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 | 园豆:52 (初学一级) | 2015-05-27 16:46

@Me_Code: 

Jerry柯 | 园豆:496 (菜鸟二级) | 2015-05-27 16:59

@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的写法

Jerry柯 | 园豆:496 (菜鸟二级) | 2015-05-28 01:09
其他回答(2)
0

可以拆分成两步,先倒序排列timestamp,然后再执行2跟3

浅草青晨 | 园豆:639 (小虾三级) | 2015-05-27 13:53
0

select  row_number() over( PARTITION BY VINNumber order by  TimeStamp  desc,ChannelID ) rid, * from  table

| 园豆:750 (小虾三级) | 2015-05-27 14:25

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 排序时,就是错误的。

支持(0) 反对(0) Me_Code | 园豆:52 (初学一级) | 2015-05-27 14:41

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

支持(0) 反对(0) Me_Code | 园豆:52 (初学一级) | 2015-05-27 14:47
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册