【问题标题】:Select max value of each group using partition by使用分区选择每个组的最大值
【发布时间】:2019-05-06 05:45:10
【问题描述】:

我有以下代码需要很长时间才能执行。我需要做的是在将其划分为三列(col_1、col_2、col_3)[这也是关键列]并按如下所述的某些列排序之后选择行号等于 1 的列。表中的记录数约为 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

【问题讨论】:

  • 很难定义一个索引来覆盖这个查询。你真的需要在这里使用SELECT *吗?
  • Tim 说的是一个好的开始...... SELECT * 可能是个问题......你能告诉我们执行计划吗?
  • @TimBiegeleisen 我可以取消 SELECT * 部分。我在这里获取 100 多行。我会尽量列出来。
  • @RodneyEllis 恐怕我无权获取执行计划。
  • 好吧,如果您无法访问执行计划,您希望如何通过试错来提高性能?

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


【解决方案1】:

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

最后,您只保留 ROW NUMBER = 1 的记录。如果我猜这个过滤器保留了所有记录的一半,如果您过滤(首先生成 ROW NUMBER 并使用 RN 保留行),这将增加查询执行时间=1) 首先,然后在列上应用 CASE 方法。

【讨论】:

    猜你喜欢
    • 2011-05-29
    • 2020-05-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-11
    • 2014-08-24
    • 1970-01-01
    • 2022-11-13
    相关资源
    最近更新 更多