0

这里已经提出了一个类似的问题。但目前的情况比以前稍微复杂一些。在示例中,如果相同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 
  • 当前输出ID:3,5,6,1,2,7,8,4
  • 预期输出 ID:3,5,1,6,8,2,7,4
4

2 回答 2

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
于 2012-11-13T09:27:07.160 回答
0

您可以使用键值对创建子查询:

   SELECT 'pass' value, 1 priority UNION ALL         
   SELECT 'fall' value, 2 priority UNION ALL
   SELECT 'withdraw' value, 3 priority UNION ALL

然后对 value 列的子查询进行连接并按优先级排序,这将为您提供更清晰的解决方案。如果有很多查找值,您甚至可以按值创建临时表和索引,以确保速度合适。

于 2012-11-13T10:34:28.723 回答