sql - 复杂的TSQL自定义排名任务

标签 sql sql-server t-sql ranking ranking-functions

我已经尝试了很多种带有连接的排名解决方案,所有这些都可以满足我想要的需求。

遗憾的是,我无法提出正确的查询来获得所需的输出。

我真的在寻求任何帮助来获得解释,以帮助我将来完成此类任务。

我有以下 CTE 表包含数据值集:

 type    model    price    code
 Shoes    1298    700,00    1
 Shoes    1298    950,00    6
 Shoes    1298    1050,00    4
 Shoes    1321    970,00    2
 Shoes    1750    1200,00    3
 Shoes    1752    1150,00    5
 Pants    1121    850,00    2
 Pants    1121    850,00    4
 Pants    1121    850,00    5
 Pants    1232    350,00    8
 Pants    1232    350,00    9
 Pants    1232    400,00    7
 Pants    1232    600,00    1
 Pants    1233    600,00    3
 Pants    1233    950,00    6
 Pants    1233    970,00    12
 Pants    1233    980,00    11
 Pants    1260    350,00    10
 Hats    1276    400,00    1
 Hats    1288    400,00    6
 Hats    1401    150,00    4
 Hats    1408    270,00    5
 Hats    1433    270,00    2
 Hats    1434    290,00    3

CTE 的统一记录编号必须按以下方式完成:首先是表中的第一个型号(鞋子、裤子和帽子),然后是最后一个型号,之后是表中的第二个型号,即倒数第二个,以此类推。在某一类型的模型用尽的情况下,仅对其他类型的剩余模型进行编号。

这是所需的输出:

Id    type    model    price           code
 1    Shoes    1298    700.0000       1
 2    Pants    1232    600.0000       1
 3    Hats    1276    400.0000        1

 4    Shoes    1298    950.0000       6
 5    Pants    1233    970.0000       12
 6    Hats    1288    400.0000        6

 7    Shoes    1321    970.0000       2
 8    Pants    1121    850.0000       2
 9    Hats    1433    270.0000        2

 10    Shoes    1752    1150.0000     5
 11    Pants    1233    980.0000      11
 12    Hats    1408    270.0000       5

 13    Shoes    1750    1200.0000     3
 14    Pants    1233    600.0000      3
 15    Hats    1434    290.0000       3

 16    Shoes    1298    1050.0000     4 
 17    Pants    1260    350.0000      10
 18    Hats    1401    150.0000       4

 19    Pants    1121    850.0000      4
 20    Pants    1232    350.0000      9

 21    Pants    1121    850.0000      5
 22    Pants    1232    350.0000      8

 23    Pants    1233    950.0000      6
 24    Pants    1232    400.0000      7

我已经更新了所需的输出(添加了代码列)以更好地理解排序思想。它必须以交错的方式完成,首先是类型的第一个编码数字(即最低代码),然后是类型的最后编码数字(即最高代码),然后是剩下的第一个编码的人先走,然后是剩下的最后一个编码的人等等

最佳答案

我无法真正理解幕后的排序,因为结果集既不是按模型排序,也不是按代码排序,但这是想法,您可以在 CTE 中使用排序:

WITH    cte1 AS ( SELECT   * ,
                        ROW_NUMBER() OVER (PARTITION BY type ORDER BY model, code) rn1
                  FROM     @t),
        cte2 AS ( SELECT   * ,
                        ROW_NUMBER() OVER (PARTITION BY rn1 ORDER BY 
                                            CASE type WHEN 'Shoes' THEN 1 
                                                      WHEN 'Pants' THEN 2 
                                                      WHEN 'Hats' THEN 3 END) rn2
                  FROM     cte1 )
SELECT  * ,
        ROW_NUMBER() OVER (ORDER BY rn1, rn2) rn
FROM    cte2

输出:

type    model   price   code    rn1 rn2 rn
Shoes   1298    700.00  1       1   1   1
Pants   1121    850.00  2       1   2   2
Hats    1276    400.00  1       1   3   3
Shoes   1298    1050.00 4       2   1   4
Pants   1121    850.00  4       2   2   5
Hats    1288    400.00  6       2   3   6
Shoes   1298    950.00  6       3   1   7
Pants   1121    850.00  5       3   2   8
Hats    1401    150.00  4       3   3   9
Shoes   1321    970.00  2       4   1   10
Pants   1232    600.00  1       4   2   11
Hats    1408    270.00  5       4   3   12
Shoes   1750    1200.00 3       5   1   13
Pants   1232    400.00  7       5   2   14
Hats    1433    270.00  2       5   3   15
Shoes   1752    1150.00 5       6   1   16
Pants   1232    350.00  8       6   2   17
Hats    1434    290.00  3       6   3   18
Pants   1232    350.00  9       7   1   19
Pants   1233    600.00  3       8   1   20
Pants   1233    950.00  6       9   1   21
Pants   1233    980.00  11      10  1   22
Pants   1233    970.00  12      11  1   23
Pants   1260    350.00  10      12  1   24

Rn 包含所需的值。

关于sql - 复杂的TSQL自定义排名任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30167247/

相关文章:

sql - 在 SSMS 18.2 中调试

sql - 规范化查询中的一行数据 - 将一行变成多行

c# - 为什么 "ORDER BY"会破坏我的查询?

sql - 我必须在不使用函数或存储过程的情况下用 '&' 分隔值分割字符串?

java - SQL 查询不从 Java 返回结果,尽管它在 Access 中返回结果

sql - 如何通过使用引用同一个表的不同列值来获取数据

sql - SQL Server 2008 中的更新列

c# - 仅显示一个选择的100个结果

sql-server - 表 Visual Basic 数据库 (T-SQL) 中的条件 If 语句

sql - 按日期选择出现次数最多的记录