如何比较 table 的两行
How to compare two rows of a table
我有一个示例 table,输入如图所示。实际上它有大量的数据。输入输出如图:
I/P- O/P-
|ID | Role | Status | |ID | Role | Status | Final |
|:-:|:----:|:------:| |:-:|:----:|:------:|:-----:|
| 1 | ABC | Pass | | 1 | ABC | Pass | 0 |
| 2 | PQR | Pass | | 2 | PQR | Pass | 0 |
| 1 | ABC | Fail | | 1 | ABC | Fail | 0 |
| 3 | PQR | Fail | | 3 | PQR | Fail | 0 |
| 1 | XYZ | Fail | | 1 | XYZ | Fail | 1 |
| 3 | PQR | Fail | | 3 | PQR | Fail | 1 |
| 3 | XYZ | Pass | | 3 | XYZ | Pass | 0 |
| 4 | XYZ | Fail | | 4 | XYZ | Fail | 1 |
因此对于 'ID'(例如 ID=1),如果两个或更多记录的角色相同(例如角色 = 'ABC'),则状态字段。如果对于任何选定的记录 'Status' = 'Pass' 那么将为所有记录创建一个名为 Final 且值为 0 的新字段(如果对于任何记录 Status = 'Pass')
否则将保留它 1(如果没有 'Status' = 'Pass'.
的记录
我知道我们可以在比较列时使用 Case 语句来做到这一点。但不确定如何处理行。谁能帮帮我。
谢谢。
您可以进行存在性检查。并且可以根据您未指定的后端以不同的方式编写:
select Id, Role, Status,
case when exists (select * from myTable t2
where t1.Id = t2.Id
and t1.Role = t2.Role
and t2.Status = 'Pass') then 0 else 1 end as Final
from myTable t1;
PS:要么是你的样本输出有误,要么是你的解释。您可能需要根据实际需要更改where部分。
我有一个示例 table,输入如图所示。实际上它有大量的数据。输入输出如图:
I/P- O/P-
|ID | Role | Status | |ID | Role | Status | Final |
|:-:|:----:|:------:| |:-:|:----:|:------:|:-----:|
| 1 | ABC | Pass | | 1 | ABC | Pass | 0 |
| 2 | PQR | Pass | | 2 | PQR | Pass | 0 |
| 1 | ABC | Fail | | 1 | ABC | Fail | 0 |
| 3 | PQR | Fail | | 3 | PQR | Fail | 0 |
| 1 | XYZ | Fail | | 1 | XYZ | Fail | 1 |
| 3 | PQR | Fail | | 3 | PQR | Fail | 1 |
| 3 | XYZ | Pass | | 3 | XYZ | Pass | 0 |
| 4 | XYZ | Fail | | 4 | XYZ | Fail | 1 |
因此对于 'ID'(例如 ID=1),如果两个或更多记录的角色相同(例如角色 = 'ABC'),则状态字段。如果对于任何选定的记录 'Status' = 'Pass' 那么将为所有记录创建一个名为 Final 且值为 0 的新字段(如果对于任何记录 Status = 'Pass') 否则将保留它 1(如果没有 'Status' = 'Pass'.
的记录我知道我们可以在比较列时使用 Case 语句来做到这一点。但不确定如何处理行。谁能帮帮我。
谢谢。
您可以进行存在性检查。并且可以根据您未指定的后端以不同的方式编写:
select Id, Role, Status,
case when exists (select * from myTable t2
where t1.Id = t2.Id
and t1.Role = t2.Role
and t2.Status = 'Pass') then 0 else 1 end as Final
from myTable t1;
PS:要么是你的样本输出有误,要么是你的解释。您可能需要根据实际需要更改where部分。