【问题标题】:Rank result set based on generated random number根据生成的随机数对结果集进行排名
【发布时间】:2019-05-01 11:39:04
【问题描述】:

我有一个 T-Sql 查询,它为每条记录生成一个随机数。我还想做的是添加 Rank 或 Row_Number 列

我已经尝试了 Rank 和 Row_Number,但是当我在 order by 子句中放入 int 时出现以下错误:

窗口函数、聚合和 NEXT VALUE FOR 函数不 支持整数索引作为 ORDER BY 子句表达式

SELECT      TOP(4) PERCENT  CONVERT(VARCHAR(10),Getdate(),103) RunDate
        , EM.EmpCode 'Emp Code'
        , D.DepotDepotDescription 'Depot'
        , cast(rand(checksum(newid())) * 10 as decimal(8, 6)) [Random Number]
        , rank() OVER (order by 100) Row
FROM        ttimport.EmployeeMaster EM 
        LEFT OUTER JOIN ttimport.PayrollFrequency PF ON EM.FrequencyDesc = PF.DescCode
        LEFT OUTER JOIN ttimport.Departments DPT ON EM.DepartmentName = DPT.DescCode
        LEFT OUTER JOIN ttimport.Depot D ON EM.DepotDepotDescription = D.DescCode

ORDER BY 4

【问题讨论】:

  • order by 100 实际上根本不进行任何排序,因为您是按静态值排序的。您想在这里实现什么目标?

标签: tsql


【解决方案1】:

哦,我想我明白你的问题出在哪里了。我假设您想根据[Random Number] 值来rank?如果是这样,请继续阅读!


您不能在 order by 中使用常量并期望它以任何方式排序,这就是您当前脚本抛出错误的原因,因为 rank 需要排序顺序。

要引用您的 Random Number 列,您只需将其包装在另一个 select 或使用 cte 到同一端:

WITH data AS
(

    SELECT      TOP(4) PERCENT  CONVERT(VARCHAR(10),Getdate(),103) RunDate
            , EM.EmpCode 'Emp Code'
            , D.DepotDepotDescription 'Depot'
            , cast(rand(checksum(newid())) * 10 as decimal(8, 6)) [Random Number]
    FROM        ttimport.EmployeeMaster EM 
            LEFT OUTER JOIN ttimport.PayrollFrequency PF ON EM.FrequencyDesc = PF.DescCode
            LEFT OUTER JOIN ttimport.Departments DPT ON EM.DepartmentName = DPT.DescCode
            LEFT OUTER JOIN ttimport.Depot D ON EM.DepotDepotDescription = D.DescCode
)
SELECT *
      , RANK() OVER (ORDER BY [Random Number]) AS Ranking
FROM data
ORDER BY 4

【讨论】:

  • @DavidCleeton 为什么要这样做?是为了数据采样吗?如果是这样的话,有一些更有效的方法可以内置到 SQL Server 中,例如 tablesample
猜你喜欢
  • 1970-01-01
  • 2014-06-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-21
  • 1970-01-01
  • 1970-01-01
  • 2021-04-06
相关资源
最近更新 更多