如何处理 SQL 中的关系
How to handle ties in SQL
SELECT
employee_id,
department_id,
first_name,
last_name,
hire_date,
job_id
FROM employees e
WHERE hire_date IN
(
SELECT max(hire_date)
FROM employees
WHERE e.department_id = department_id
)
ORDER BY hire_date ASC
Result of the query
这是我的查询及其结果。 SA_REP 部门有两个并列的结果,我应该只有一个结果 - 例如 employee_id 较低的那个。我用谷歌搜索了这个问题,但似乎找不到任何相关结果...
感谢您的帮助!
您可以使用 not exists
查询,这会给您带来更大的灵活性:
SELECT *
FROM employees e
WHERE NOT EXISTS ( -- no x exists that...
SELECT *
FROM employees x
WHERE x.department_id = e.department_id -- belongs to same department
AND (
x.hire_date > e.hire_date OR -- but hired later than e
x.hire_date = e.hire_date AND x.employee_id < e.employee_id -- hired on same date but has lesser employee id than e
)
)
您可以在这里使用RANK
解析函数:
WITH cte AS (
SELECT e.*, RANK() OVER (PARTITION BY department_id
ORDER BY hire_date DESC, employee_id) rnk
FROM employees e
)
SELECT employee_id, department_id, first_name, last_name, hire_date, job_id
FROM cte
WHERE rnk = 1;
SELECT
employee_id,
department_id,
first_name,
last_name,
hire_date,
job_id
FROM employees e
WHERE hire_date IN
(
SELECT max(hire_date)
FROM employees
WHERE e.department_id = department_id
)
ORDER BY hire_date ASC
Result of the query
这是我的查询及其结果。 SA_REP 部门有两个并列的结果,我应该只有一个结果 - 例如 employee_id 较低的那个。我用谷歌搜索了这个问题,但似乎找不到任何相关结果...
感谢您的帮助!
您可以使用 not exists
查询,这会给您带来更大的灵活性:
SELECT *
FROM employees e
WHERE NOT EXISTS ( -- no x exists that...
SELECT *
FROM employees x
WHERE x.department_id = e.department_id -- belongs to same department
AND (
x.hire_date > e.hire_date OR -- but hired later than e
x.hire_date = e.hire_date AND x.employee_id < e.employee_id -- hired on same date but has lesser employee id than e
)
)
您可以在这里使用RANK
解析函数:
WITH cte AS (
SELECT e.*, RANK() OVER (PARTITION BY department_id
ORDER BY hire_date DESC, employee_id) rnk
FROM employees e
)
SELECT employee_id, department_id, first_name, last_name, hire_date, job_id
FROM cte
WHERE rnk = 1;