teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

3

推敲

2021/04/27 01:07

投稿

sazi
sazi

スコア25430

answer CHANGED
@@ -19,7 +19,7 @@
19
19
  追記
20
20
  --
21
21
  TOP3に対応。
22
- [unnest()](https://www.postgresql.jp/document/12/html/functions-array.html)を使用して、横を縦に変換(配列を行集合に展開)して集計します。
22
+ 集計したものを[unnest()](https://www.postgresql.jp/document/12/html/functions-array.html)を使用して、横を縦に変換(配列を行集合に展開)し、limitします。
23
23
  ```SQL
24
24
  with tbl as (
25
25
  select *

2

追記

2021/04/27 01:07

投稿

sazi
sazi

スコア25430

answer CHANGED
@@ -68,4 +68,15 @@
68
68
  where 最大要素
69
69
  group by 要素No
70
70
  order by count(*) desc limit 3
71
+ ```
72
+ 正規化された状態のテーブルだった場合で記述すると、以下の様にシンプルになります。
73
+ ```SQL
74
+ select 要素NO, count(*) as 件数
75
+ from (
76
+ select *, max(要素) over(partition by 名前)=要素 as 最大要素
77
+ from tbl
78
+ ) pick_max
79
+ where 最大要素
80
+ group by 要素No
81
+ order by count(*) desc limit 3
71
82
  ```

1

追記

2021/04/27 01:04

投稿

sazi
sazi

スコア25430

answer CHANGED
@@ -15,4 +15,57 @@
15
15
  ,('五郎',30,20,10,40)
16
16
  ,('六郎',10,40,30,20)
17
17
  ) as w(名前,要素①,要素②,要素③,要素④)
18
+ ```
19
+ 追記
20
+ --
21
+ TOP3に対応。
22
+ [unnest()](https://www.postgresql.jp/document/12/html/functions-array.html)を使用して、横を縦に変換(配列を行集合に展開)して集計します。
23
+ ```SQL
24
+ with tbl as (
25
+ select *
26
+ from (values
27
+ ('太郎',40,30,20,10)
28
+ ,('次郎',30,20,10,40)
29
+ ,('三郎',40,30,20,10)
30
+ ,('四郎',40,30,20,10)
31
+ ,('五郎',30,20,10,40)
32
+ ,('六郎',10,40,30,20)
33
+ ) as w(名前,要素①,要素②,要素③,要素④)
34
+ )
35
+ select 要素No, 要素件数
36
+ from (
37
+ select sum(case when 要素① = greatest(要素①,要素②,要素③,要素④) then 1 else 0 end) as 要素①
38
+ , sum(case when 要素② = greatest(要素①,要素②,要素③,要素④) then 1 else 0 end) as 要素②
39
+ , sum(case when 要素③ = greatest(要素①,要素②,要素③,要素④) then 1 else 0 end) as 要素③
40
+ , sum(case when 要素④ = greatest(要素①,要素②,要素③,要素④) then 1 else 0 end) as 要素④
41
+ from tbl
42
+ ) t
43
+ , unnest(array[要素①,要素②,要素③,要素④]::integer[]) with ordinality as u(要素件数, 要素No)
44
+ order by 要素件数 desc limit 3
45
+ ```
46
+ 元々は正規化されていない状態が、集計し辛い状況を作っているので、unnestを使用して一旦正規化し
47
+ て集計した場合は以下。
48
+ ```SQL
49
+ with tbl as (
50
+ select *
51
+ from (values
52
+ ('太郎',40,30,20,10)
53
+ ,('次郎',30,20,10,40)
54
+ ,('三郎',40,30,20,10)
55
+ ,('四郎',40,30,20,10)
56
+ ,('五郎',30,20,10,40)
57
+ ,('六郎',10,40,30,20)
58
+ ) as w(名前,要素①,要素②,要素③,要素④)
59
+ )
60
+ select 要素NO, count(*) as 件数
61
+ from (
62
+ select *, max(要素) over(partition by 名前)=要素 as 最大要素
63
+ from (
64
+ select 名前, 要素No, 要素
65
+ from tbl, unnest(array[要素①,要素②,要素③,要素④]::integer[]) with ordinality as u(要素, 要素No)
66
+ ) nomalize
67
+ ) pick_max
68
+ where 最大要素
69
+ group by 要素No
70
+ order by count(*) desc limit 3
18
71
  ```