如何有条件地 select SQL 中的唯一值?
How do I conditionally select a unique value in SQL?
我的任务是 return 只处理具有唯一 ID 的行,但 return 为 SQL 中的每个 ID 处理一行。我该怎么做?
逻辑:
对于主行,select 其中 JOB_INDICATOR = ‘P’。如果有多行,则使用 PRIM_ROLE_IND = ‘Y’ 的记录。如果还有多个,则 select 最低编号 EMPL_RCD 从 0 开始。
示例起点:
id
name
job
job_indicator
prim_role_ind
empl_rcd
1001
John Doe
Director
P
N
0
1001
John Doe
Professor
P
Y
1
1001
John Doe
Coach
N
N
2
1002
Bob Jones
Head Janitor
P
Y
0
1002
Bob Jones
Associate Janitor
P
Y
1
1003
Susan Smith
Groundskeeper
P
N
0
1003
Susan Smith
Professor
P
N
1
想要return:
id
name
job
job_indicator
prim_role_ind
empl_rcd
1001
John Doe
Professor
P
Y
1
1002
Bob Jones
Head Janitor
P
Y
0
1003
Susan Smith
Groundskeeper
P
N
0
到目前为止,我有以下内容,但添加了一个新要求来执行条件组件。
SELECT *
FROM EMPLOYEE
WHERE JOB_INDICATOR = 'P'
您可以使用 window 函数 ROW_NUMBER()
来完成此操作:
SELECT *
FROM
(
SELECT EMPLOYEE.*, ROW_NUMBER() OVER (PARTITION BY id ORDER BY
prim_role_ind DESC, empl_rcd ASC) as rn
FROM EMPLOYEE
WHERE JOB_INDICATOR = 'P'
) dt
WHERE rn = 1
我的任务是 return 只处理具有唯一 ID 的行,但 return 为 SQL 中的每个 ID 处理一行。我该怎么做?
逻辑: 对于主行,select 其中 JOB_INDICATOR = ‘P’。如果有多行,则使用 PRIM_ROLE_IND = ‘Y’ 的记录。如果还有多个,则 select 最低编号 EMPL_RCD 从 0 开始。
示例起点:
id | name | job | job_indicator | prim_role_ind | empl_rcd |
---|---|---|---|---|---|
1001 | John Doe | Director | P | N | 0 |
1001 | John Doe | Professor | P | Y | 1 |
1001 | John Doe | Coach | N | N | 2 |
1002 | Bob Jones | Head Janitor | P | Y | 0 |
1002 | Bob Jones | Associate Janitor | P | Y | 1 |
1003 | Susan Smith | Groundskeeper | P | N | 0 |
1003 | Susan Smith | Professor | P | N | 1 |
想要return:
id | name | job | job_indicator | prim_role_ind | empl_rcd |
---|---|---|---|---|---|
1001 | John Doe | Professor | P | Y | 1 |
1002 | Bob Jones | Head Janitor | P | Y | 0 |
1003 | Susan Smith | Groundskeeper | P | N | 0 |
到目前为止,我有以下内容,但添加了一个新要求来执行条件组件。
SELECT *
FROM EMPLOYEE
WHERE JOB_INDICATOR = 'P'
您可以使用 window 函数 ROW_NUMBER()
来完成此操作:
SELECT *
FROM
(
SELECT EMPLOYEE.*, ROW_NUMBER() OVER (PARTITION BY id ORDER BY
prim_role_ind DESC, empl_rcd ASC) as rn
FROM EMPLOYEE
WHERE JOB_INDICATOR = 'P'
) dt
WHERE rn = 1