私はmytable
を次のように構成しており、各行のattribute
の値の出現をカウントしたいと思います。
id | attribute
--------------
1 | spam
2 | Egg
3 | spam
と
SELECT id, attribute, COUNT(attribute) FROM mytable GROUP BY attribute
私は得るだけです
id | attribute | count
----------------------
1 | spam | 2
2 | Egg | 1
しかし、私が結果として欲しいのは
id | attribute | count
----------------------
1 | spam | 2
2 | Egg | 1
3 | spam | 2
これを達成する方法は?
select
m1.id,
m1.attribute,
(select count(*) from mytable m2 where m2.attribute = m1.attribute)
from
mytable m1
;
別のバージョン:
select
m1.id,
m1.attribute,
m2.c
from
mytable m1
join (SELECT attribute, COUNT(attribute) as c FROM mytable GROUP BY attribute) m2
on (m1.attribute = m2.attribute)
;
分析/ウィンドウ関数を備えたデータベースのより良いバージョン:
select
m1.id,
m1.attribute,
count(*) over (partition by m1.attribute)
from
mytable m1
;