已经问过类似的问题here。但目前的情况比以前有点复杂。在示例中,如果相同Itime
,那么我们可以按案例排序,但如果Itime
和结果相同,那么我该如何排序。
我的问题是,结果ID:3,5,6,1,2,7,8,4。为什么失败案例是2,7,8。
为什么不是8,2,7?
如果我想要预期结果如:3,5,1,6,8,2,7,4我该怎么办?
请运行以下命令并帮我排序。提前谢谢。
if object_id('tempdb.dbo.#temp321','U') is not null
drop table tempdb.dbo.#temp321
create table #temp321(id int, uname varchar(50), current_point int,
previous_point int, ITime datetime, Result varchar(10))
INSERT into #temp321 values('1','a','50','40','2012-11-12 13:12:28.103','pass')
INSERT into #temp321 values('2','b','15','10','2012-11-12 13:12:28.103','fail')
INSERT into #temp321 values('3','c','71','70','2012-11-12 12:58:30.000','pass')
INSERT into #temp321 values('4','d','34','30','2012-11-12 13:12:28.103','withdraw')
INSERT into #temp321 values('5','e','40','35','2012-11-12 12:58:41.360','withdraw')
INSERT into #temp321 values('6','f','65','60','2012-11-12 13:12:28.103','pass')
INSERT into #temp321 values('7','g','20','15','2012-11-12 13:12:28.103','fail')
INSERT into #temp321 values('8','h','10','7','2012-11-12 13:12:28.103','fail')
select
ID
from
#temp321
ORDER BY
ITime ASC,
CASE Result
WHEN 'pass' THEN 1
WHEN 'fail' THEN 2
WHEN 'withdrow' THEN 3
END
drop table #temp321
答案 0 :(得分:5)
当前查询不会每次都提供相同的订单。
对我来说,你的例子是:
3, 5, 1, 6, 2, 7, 8, 4 (Note 1 and 6 being swapped)
考虑到分类,1和6与它们的排序值相比是“相等的”。如果没有指定排序(或相同的排序),那么该组中的顺序是 - 按定义 - 未定义。 (取决于线程创建数据的顺序)
同样适用于2, 7, 8
。您想要订单3, 5, 1, 6, 8, 2, 7, 4
- 所以您似乎“拥有”一个逻辑,您希望它如何排序?然后添加该条件,你就完成了:)
(对于您的预期输出,添加current_point是您想要的 - 但您必须知道是否要按该列排序)
SELECT *
FROM temp321
ORDER BY ITime ASC,
CASE Result
WHEN 'pass' THEN 1
WHEN 'fail' THEN 2
WHEN 'withdraw' THEN 3
END, current_point ASC
答案 1 :(得分:0)
您可以使用键值对创建子查询:
SELECT 'pass' value, 1 priority UNION ALL
SELECT 'fall' value, 2 priority UNION ALL
SELECT 'withdraw' value, 3 priority UNION ALL
然后在值列上连接到子查询并按优先级排序,这将为您提供更清晰的解决方案。如果有大量查找值,您甚至可以按值创建临时表和索引,以确保速度合适。