使用分区选择每个组的最大值

时间:2019-05-06 05:45:10

标签: sql sql-server tsql group-by common-table-expression

我有以下代码需要很长时间才能执行。我需要做的是选择行号等于1的列,然后将其划分为三列(col_1,col_2,col_3)(这也是关键列),并按如下所述对某些列进行排序。该表中的记录数约为9000万。我是遵循最佳方法还是有其他更好的方法?

  with cte as (SELECT
     b.*
    ,ROW_NUMBER() OVER ( PARTITION BY col_1,col_2,col_3
                         ORDER BY new_col DESC, new_col_2 DESC, new_col_3 DESC  ) AS ROW_NUMBER
  FROM (
    SELECT
       *
      ,CASE
         WHEN update_col = '        ' THEN new_update_col
         ELSE update_col
       END AS new_col_1
    FROM schema_name.table_name
    ) b
  )
 select top 10 * from cte WHERE ROW_NUMBER=1

1 个答案:

答案 0 :(得分:0)

当前,您正在对不同的列应用CASE,这会影响数据库表中的所有行。 CASE(字符串比较)是一种昂贵的方法。

最后,您仅保留ROW NUMBER = 1的记录。如果我猜想此过滤器保留所有记录的一半,那么如果您进行过滤(生成ROW NUMBER First和RN ROW Rows),这将增加查询执行时间。 = 1)首先在列上应用CASE方法。