WHERE 子句中的不同和大小写
distinct and case within WHERE clause
我可以在 where 子句后使用 case 吗?以下是我的查询。
谢谢,
select unit_id, law_id, risk, count(risk) as crr
from schema.table1
group by unit_id, law_id, risk
order by crr desc, risk desc
结果
unit_id |law_id | risk | crr
----------------------------------
| 1 | 3 |Significant| 3
| 1 | 3 |Limited | 3
| 3 | 2 |Significant| 1
| 1 | 1 |Significant| 1
| 2 | 2 |Medium | 1
| 1 | 3 |Critical | 1
当我对它们进行排名时
select unit_id, law_id, a.risk,
rank() OVER (PARTITION BY unit_id, law_id ORDER BY crr DESC, risk DESC ) as rank
from (select unit_id, law_id, risk, count(risk) as crr
from schema.table1
group by unit_id, law_id, risk
order by crr desc, risk desc
) a
结果
unit_id |law_id | risk | rank
----------------------------------
| 1 | 1 |Significant| 1
| 1 | 3 |Significant| 1
| 1 | 3 |Limited | 2
| 1 | 3 |Critical | 3
| 2 | 2 |Medium | 1
| 3 | 2 |Significant| 1
我的查询得到以下结果。但我想获得所有排名为 1 的排名并忽略排名 1 并获得关键(无论排名是什么)如果上面的结果有任何结果。
我想得到如下所示的结果。
select unit_id, law_id, risk FROM
(select unit_id, law_id, a.risk,
rank() OVER (PARTITION BY unit_id, law_id ORDER BY crr DESC, risk DESC ) as rank
from (select unit_id, law_id, risk, count(risk) as crr
from schema.table1 group by unit_id, law_id, risk
order by crr desc, risk desc
) a )b WHERE rank = 1 or risk = 'Critical'
实际结果
unit_id |law_id | risk
----------------------------
| 1 | 1 |Significant
| 1 | 3 |Significant
| 1 | 3 |Critical
| 2 | 2 |Medium
| 3 | 2 |Significant
预期结果
unit_id |law_id | risk
----------------------------
| 1 | 1 |Significant
| 1 | 3 |Critical
| 2 | 2 |Medium
| 3 | 2 |Significant
尝试在 RANK()
ORDER BY
中使用 CASE EXPRESSION
:
select unit_id, law_id, risk FROM
(select unit_id, law_id, a.risk,
rank() OVER (PARTITION BY unit_id, law_id
ORDER BY CASE WHEN risk = 'Critical' then 1 else 0 end DESC, crr DESC, risk DESC ) as rank
from (select unit_id, law_id, risk, count(risk) as crr
from schema.table1 group by unit_id, law_id, risk
order by crr desc, risk desc
) a )b WHERE rank = 1
这样,critical
排在第1位,其他的按你的逻辑排。
我可以在 where 子句后使用 case 吗?以下是我的查询。
谢谢,
select unit_id, law_id, risk, count(risk) as crr
from schema.table1
group by unit_id, law_id, risk
order by crr desc, risk desc
结果
unit_id |law_id | risk | crr
----------------------------------
| 1 | 3 |Significant| 3
| 1 | 3 |Limited | 3
| 3 | 2 |Significant| 1
| 1 | 1 |Significant| 1
| 2 | 2 |Medium | 1
| 1 | 3 |Critical | 1
当我对它们进行排名时
select unit_id, law_id, a.risk,
rank() OVER (PARTITION BY unit_id, law_id ORDER BY crr DESC, risk DESC ) as rank
from (select unit_id, law_id, risk, count(risk) as crr
from schema.table1
group by unit_id, law_id, risk
order by crr desc, risk desc
) a
结果
unit_id |law_id | risk | rank
----------------------------------
| 1 | 1 |Significant| 1
| 1 | 3 |Significant| 1
| 1 | 3 |Limited | 2
| 1 | 3 |Critical | 3
| 2 | 2 |Medium | 1
| 3 | 2 |Significant| 1
我的查询得到以下结果。但我想获得所有排名为 1 的排名并忽略排名 1 并获得关键(无论排名是什么)如果上面的结果有任何结果。 我想得到如下所示的结果。
select unit_id, law_id, risk FROM
(select unit_id, law_id, a.risk,
rank() OVER (PARTITION BY unit_id, law_id ORDER BY crr DESC, risk DESC ) as rank
from (select unit_id, law_id, risk, count(risk) as crr
from schema.table1 group by unit_id, law_id, risk
order by crr desc, risk desc
) a )b WHERE rank = 1 or risk = 'Critical'
实际结果
unit_id |law_id | risk
----------------------------
| 1 | 1 |Significant
| 1 | 3 |Significant
| 1 | 3 |Critical
| 2 | 2 |Medium
| 3 | 2 |Significant
预期结果
unit_id |law_id | risk
----------------------------
| 1 | 1 |Significant
| 1 | 3 |Critical
| 2 | 2 |Medium
| 3 | 2 |Significant
尝试在 RANK()
ORDER BY
中使用 CASE EXPRESSION
:
select unit_id, law_id, risk FROM
(select unit_id, law_id, a.risk,
rank() OVER (PARTITION BY unit_id, law_id
ORDER BY CASE WHEN risk = 'Critical' then 1 else 0 end DESC, crr DESC, risk DESC ) as rank
from (select unit_id, law_id, risk, count(risk) as crr
from schema.table1 group by unit_id, law_id, risk
order by crr desc, risk desc
) a )b WHERE rank = 1
这样,critical
排在第1位,其他的按你的逻辑排。