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 子句,但它们之间有一些区别:
以下是一个简单的 HAVING 子句示例:
SELECT department_id, COUNT(employee_id) as num_employees
FROM employees
GROUP BY department_id
HAVING num_employees > 10;
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;
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 列。
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;