SQL中的HAVING、ROW_NUMBER,常见使用场景:求维度的topN

获取维度的topN

1、前N条维度项(having in)

HAVING 子句在 SQL 查询中与 GROUP BY 子句一起使用,用于对分组后的结果进行筛选。它主要用于对聚合函数(如 COUNT、SUM、AVG、MIN、MAX 等)的结果进行条件过滤。

HAVING 子句的基本语法如下:

SELECT column1, column2, ..., columnN, aggregate_function(column)
FROM table_name
WHERE condition
GROUP BY column1, column2, ..., columnN
HAVING condition
ORDER BY column;

其中,aggregate_function(column) 是聚合函数,如 COUNT、SUM、AVG、MIN、MAX 等。column1, column2, …, columnN 是要分组的列。condition 是筛选分组后的结果的条件。

HAVING 子句的作用类似于 WHERE 子句,但它们之间有一些区别:

  1. WHERE 子句在数据分组前进行筛选,而 HAVING 子句在数据分组后进行筛选。
  2. WHERE 子句主要用于筛选行,而 HAVING 子句主要用于筛选分组后的结果。
  3. WHERE 子句中不能使用聚合函数,而 HAVING 子句中必须使用聚合函数。

以下是一个简单的 HAVING 子句示例:

SELECT department_id, COUNT(employee_id) as num_employees
FROM employees
GROUP BY department_id
HAVING num_employees > 10;

常见sql写法

select area,
  category,
  sales sum_index_sales_0
from (
    select area,
      category,
      sales
    from localdoc_topN t
  ) a
group by area,
  category,
  sales
having area in (
    select area
    from (
        select area,
          sum(sales) sum_index_sales_0
        from localdoc_topN
        group by area
        order by sum_index_sales_0 desc
        limit 2
      ) b
  )
limit 5000;

2、每个维度的前N条(row_number)

ROW_NUMBER() 是一个窗口函数,用于在查询结果中为每一行分配一个唯一的行号。它在 SQL 查询中特别有用,因为它允许您对结果集进行排序和分页。

ROW_NUMBER() 函数的基本语法如下:

ROW_NUMBER() OVER (PARTITION BY partition_column ORDER BY order_column)

其中,partition_column 是用于分区的列,order_column 是用于排序的列。

以下是一个简单的 ROW_NUMBER() 示例:

SELECT id, name, ROW_NUMBER() OVER (ORDER BY name) as row_number
FROM users;

在这个示例中,我们从 users 表中选择了 id 和 name 列。然后,我们使用 ROW_NUMBER() 函数为每一行分配一个唯一的行号,按照 name 列进行排序。查询结果将包含 id、name 和 row_number 列。

ROW_NUMBER() 函数还可以与 PARTITION BY 子句一起使用,以在分区中为每一行分配行号。例如:

SELECT id, name, department, ROW_NUMBER() OVER (PARTITION BY department ORDER BY name) as row_number
FROM employees;

在这个示例中,我们从 employees 表中选择了 id、name 和 department 列。然后,我们使用 ROW_NUMBER() 函数为每个部门中的员工分配一个唯一的行号,按照 name 列进行排序。查询结果将包含 id、name、department 和 row_number 列。

常见sql写法

select area,
  category,
  index_sales_0
from (
    select area,
      category,
      sum(sales) index_sales_0,
      row_number() over (
        partition by area
        order by sum(sales) desc
      ) rank_num
    from (
        select area,
          category,
          sales
        from localdoc_topN
      ) t
    group by area,
      category
  ) a
where a.rank_num <= 2
limit 5000;
  • 10
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

涅槃Ls

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值