use*_*847 6 t-sql sql-server sql-server-2008
我有一个使用SQL Server 2008的表,它有一个带有两个可排序列的表,一个是手动设置的,另一个是通过系统过程计算的(此过程将所有内容整体排序,并从10开始分配排序,直到最高行次数10)
ID    Manual     System
------------------------
1      null      300
2      2         380
3      null      500
4      null      200
我试图让它将id分类为4,2,1,3
我希望输出在应用时对系统进行手动排序.如果添加了另一行并且还需要考虑手动排序,则会使事情进一步复杂化.
ID    Manual     System
-----------------------
1      null      300
2      2         380
3      null      500
4      null      200
5      5         100
所以新的排序将是4,2,1,3,5
ID    Manual     System
-----------------------
4      null      200
2      2         380
1      null      300
3      null      200
5      5         100
有任何想法吗?我尝试过Rank,Dense_Rank,Row_Number等.
给出的解决方案似乎对我的例子是正确的.我忘了提到第三列personID也是这里的一个因素.
ID    Manual     System    PersonID
-------------------------------------
4      null      200         22
2      2         380         22
1      null      300         22
3      null      200         22
5      5         100         22
8      1         210         25
6      1         480         25
7      null      600         25
9      4         800         25
10     null      990         25
所以我首先要按人员订购,然后通过手动排序,然后排序.这似乎仍然给我一个问题.
这是我的解决方案:http://sqlfiddle.com/#!3/ a32a0/1/0
SELECT *
FROM
(
  SELECT
    ID
    , ROW_NUMBER() OVER (PARTITION BY PersonID ORDER BY System)-.1 AS rn
    , Manual
    , System
    , PersonID
  FROM YourTable
) t0
ORDER BY PersonID
  , COALESCE(Manual, RN)
解释如下:
PARTITION BY...之前我ORDER BY...会重置每个分组的索引MANUALROW_NUMBER和MANUAL排序之间存在平局,我减去 0.1((0,1) 之间的任意数量)。MANUAL这会在出现平局时优先考虑该值ORDER BY是PARTITION BY值,首先确保正确分组,然后按 和 的第一个非空值进行MANUAL排序RN试一试。+指向前两个答案的起点。我使用其中一个作为起点并从那里重写。
编辑:删除了 .1 的减法并添加了一个新的排名函数,该函数“欺骗”优化器更喜欢手动而不是排名。我不知道这是否适用于所有情况,或者优化器在其他情况下是否无法按此顺序给出结果,但我想包括这些发现,以防万一它们有帮助。
我更新后的查询如下:
SELECT *
  FROM
  (
    SELECT
      ID
      , ROW_NUMBER() OVER (PARTITION BY PersonID ORDER BY System) AS rn
      , ROW_NUMBER() OVER (PARTITION BY PersonID ORDER BY Manual) AS rn_throwaway
      , Manual
      , System
      , PersonID
    FROM YourTable
  ) t0
ORDER BY PersonID
  , COALESCE(Manual, RN)
使用中的示例位于http://sqlfiddle.com/#!3/1831d/55/0和http://sqlfiddle.com/#!3/a32a0/9/0
| 归档时间: | 
 | 
| 查看次数: | 1909 次 | 
| 最近记录: |