首页 > 解决方案 > SQL Partition by with 条件

问题描述

我想根据两列 Type 和 Env 对数据进行分区,并按 count desc 获取每个分区顺序的前 5 条记录。我面临的问题是我需要根据 LIKE 条件对 Env 进行分区。数据 -

类型 环境 数数
T1 E1 1
T1 M1 2
T1 AB1 3
T2 E1 1
T2 M1 2
T2 CB1 3
T2 M1 5

我想要的结果 - 假设我现在正在获取前 (1) 条记录

类型 环境 数数
T1 M1 2
T1 AB1 3
T2 CB1 3
T2 M1 5

在这里,我将环境划分为条件(env LIKE "%M%" 和 env NOT LIKE "%M")

我能想到的一种方法是使用分区和联合,但这是一个非常昂贵的调用,因为我要从中过滤大量数据。有没有更好的方法来实现这一目标?

SELECT 
  *
FROM 
  (
    SELECT 
      *,
      ROW_NUMBER() OVER (PARTITION BY Type ORDER BY Count DESC) AS maxCount
    FROM
      table 
    WHERE
      Env LIKE '%M%'
  ) AS t1
WHERE
  t1.maxCount <= 5
UNION
SELECT 
  *
FROM 
  (
    SELECT 
      *,
      ROW_NUMBER() OVER (PARTITION BY Type ORDER BY Count DESC) AS maxCount
    FROM
      table 
    WHERE
      Env NOT LIKE '%M%'
  ) AS t1
WHERE
  t1.maxCount <= 5

标签: sqltsqlscopescriptpartition-by

解决方案


您似乎希望partition by在您的row_number():

select t.*
from (select t.*,
             row_number() over (partition by type, case when environment like '%M%' then 1 else 2 end)
                                order by count desc
                               ) as seqnum
      from t
     ) t
where seqnum <= 5;

推荐阅读