布尔条件分组依据,Window 函数
Boolean Condition Group By, Window Functions
我正在尝试根据组中的条件添加新列。
我们可以做类似的事情吗
BOOL() OVER (PARTITION BY id 'D' in val)
这类似于 GROUP BY id
并检查值 'D" val column
输入:
-------------
| id | val |
------------|
| 1 | A |
| 1 | B |
| 1 | D |
| 2 | B |
| 2 | C |
| 2 | A |
输出
-------------------
| id | val | res |
------------|-----|
| 1 | A | 1 |
| 1 | B | 1 |
| 1 | D | 1 |
| 2 | B | 0 |
| 2 | C | 0 |
| 2 | A | 0 |
您没有指定您的 DBMS,但在标准 ANSI SQL 中,您可以使用 filter()
子句:
count(*) filter (where val = 'D') over (partition by id) > 0
在 Postgres 中,您可以为此使用 bool_or()
:
select t.*, bool_or(val = 'D') over(partition by id) res
from mytable t
id | val | res
-: | :-- | :--
1 | A | t
1 | B | t
1 | D | t
2 | B | f
2 | C | f
2 | A | f
这给你一个布尔结果。如果您希望它作为整数值,则:
(bool_or(val = 'D') over(partition by id))::int
我正在尝试根据组中的条件添加新列。
我们可以做类似的事情吗
BOOL() OVER (PARTITION BY id 'D' in val)
这类似于 GROUP BY id
并检查值 'D" val column
输入:
-------------
| id | val |
------------|
| 1 | A |
| 1 | B |
| 1 | D |
| 2 | B |
| 2 | C |
| 2 | A |
输出
-------------------
| id | val | res |
------------|-----|
| 1 | A | 1 |
| 1 | B | 1 |
| 1 | D | 1 |
| 2 | B | 0 |
| 2 | C | 0 |
| 2 | A | 0 |
您没有指定您的 DBMS,但在标准 ANSI SQL 中,您可以使用 filter()
子句:
count(*) filter (where val = 'D') over (partition by id) > 0
在 Postgres 中,您可以为此使用 bool_or()
:
select t.*, bool_or(val = 'D') over(partition by id) res
from mytable t
id | val | res -: | :-- | :-- 1 | A | t 1 | B | t 1 | D | t 2 | B | f 2 | C | f 2 | A | f
这给你一个布尔结果。如果您希望它作为整数值,则:
(bool_or(val = 'D') over(partition by id))::int