2

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

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

我真的在寻找任何帮助来获得解释,以帮助我将来完成这些任务。

我有以下 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

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

4

3 回答 3

1

您希望值交错。您可以这样做:

with cte as ( . . . )
select row_number() over (order by seqnum, charindex(type, 'ShoesPantsHats')) as id,
       t.*
from (select cte.*,
             row_number() over (partition by type order by (select NULL)) as seqnum
      from cte
     ) t
order by seqnum,
         charindex(type, 'ShoesPantsHats');

注意 的order by子句row_number()。SQL 表本质上是无序的,如果您关心每种类型中结果的顺序,那么将适当的逻辑放在那里。

于 2015-05-11T12:10:55.520 回答
1

我无法真正理解幕后的排序,因为结果集既不是按模型排序也不是按代码排序的,但这是这个想法,您可以在 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包含所需的值。

于 2015-05-11T13:08:56.770 回答
0

尝试这个,

with cte as (select type, model,price, ROW_NUMBER() over (partition by type order by type) as rowid from temp)
select * from cte order by rowid, type
于 2015-05-11T12:32:50.530 回答