溫馨提示×

  • 首頁 > 
  • 問答 > 
  • 云計算  > 
  • 如何在Oracle中使用GROUPING函數(shù)進行數(shù)據(jù)排名

如何在Oracle中使用GROUPING函數(shù)進行數(shù)據(jù)排名

小樊
86
2024-09-02 09:42:01
欄目: 云計算

在Oracle數(shù)據(jù)庫中,GROUPING函數(shù)通常與GROUP BYROLLUP一起使用,以便對數(shù)據(jù)進行分組和匯總

首先,假設我們有一個名為employees的表,其中包含員工的信息,如下所示:

CREATE TABLE employees (
  id NUMBER PRIMARY KEY,
  name VARCHAR2(50),
  department_id NUMBER,
  salary NUMBER
);

接下來,我們將插入一些示例數(shù)據(jù):

INSERT INTO employees (id, name, department_id, salary) VALUES (1, 'Alice', 10, 5000);
INSERT INTO employees (id, name, department_id, salary) VALUES (2, 'Bob', 10, 6000);
INSERT INTO employees (id, name, department_id, salary) VALUES (3, 'Charlie', 20, 7000);
INSERT INTO employees (id, name, department_id, salary) VALUES (4, 'David', 20, 8000);

現(xiàn)在,我們將使用GROUPING函數(shù)對部門進行分組,并計算每個部門的平均工資。我們還將使用ROLLUP對所有部門進行匯總。

SELECT
  department_id,
  AVG(salary) AS avg_salary,
  GROUPING(department_id) AS is_grouped
FROM
  employees
GROUP BY
  ROLLUP (department_id)
ORDER BY
  department_id;

這將返回以下結(jié)果:

DEPARTMENT_ID  AVG_SALARY  IS_GROUPED
-------------  ----------  ----------
10             5500        0
20             7500        0
NULL           6500        1

在這個例子中,GROUPING函數(shù)返回0表示該行是一個實際的部門分組,而返回1表示該行是一個匯總行(在這種情況下為所有部門的匯總)。

要對結(jié)果進行排名,可以使用RANK()DENSE_RANK()窗口函數(shù)。以下是一個使用DENSE_RANK()的例子:

WITH grouped_data AS (
  SELECT
    department_id,
    AVG(salary) AS avg_salary,
    GROUPING(department_id) AS is_grouped
  FROM
    employees
  GROUP BY
    ROLLUP (department_id)
)
SELECT
  department_id,
  avg_salary,
  DENSE_RANK() OVER (ORDER BY avg_salary DESC) AS rank
FROM
  grouped_data
WHERE
  is_grouped = 0
ORDER BY
  department_id;

這將返回以下結(jié)果:

DEPARTMENT_ID  AVG_SALARY  RANK
-------------  ----------  ----
20             7500        1
10             5500        2

在這個例子中,我們首先使用WITH子句創(chuàng)建了一個名為grouped_data的臨時結(jié)果集,其中包含使用GROUPINGROLLUP的查詢結(jié)果。然后,我們從grouped_data中選擇部門ID、平均工資和排名,其中排名是根據(jù)平均工資降序排列的。最后,我們使用WHERE子句過濾掉匯總行,只顯示實際部門的排名。

0