回答編集履歴

3

推敲

2021/04/27 01:07

投稿

sazi
sazi

スコア25327

test CHANGED
@@ -40,7 +40,7 @@
40
40
 
41
41
  TOP3に対応。
42
42
 
43
- [unnest()](https://www.postgresql.jp/document/12/html/functions-array.html)を使用して、横を縦に変換(配列を行集合に展開)して集計します。
43
+ 集計したものを[unnest()](https://www.postgresql.jp/document/12/html/functions-array.html)を使用して、横を縦に変換(配列を行集合に展開)し、limitします。
44
44
 
45
45
  ```SQL
46
46
 

2

追記

2021/04/27 01:07

投稿

sazi
sazi

スコア25327

test CHANGED
@@ -139,3 +139,25 @@
139
139
  order by count(*) desc limit 3
140
140
 
141
141
  ```
142
+
143
+ 正規化された状態のテーブルだった場合で記述すると、以下の様にシンプルになります。
144
+
145
+ ```SQL
146
+
147
+ select 要素NO, count(*) as 件数
148
+
149
+ from (
150
+
151
+ select *, max(要素) over(partition by 名前)=要素 as 最大要素
152
+
153
+ from tbl
154
+
155
+ ) pick_max
156
+
157
+ where 最大要素
158
+
159
+ group by 要素No
160
+
161
+ order by count(*) desc limit 3
162
+
163
+ ```

1

追記

2021/04/27 01:04

投稿

sazi
sazi

スコア25327

test CHANGED
@@ -33,3 +33,109 @@
33
33
  ) as w(名前,要素①,要素②,要素③,要素④)
34
34
 
35
35
  ```
36
+
37
+ 追記
38
+
39
+ --
40
+
41
+ TOP3に対応。
42
+
43
+ [unnest()](https://www.postgresql.jp/document/12/html/functions-array.html)を使用して、横を縦に変換(配列を行集合に展開)して集計します。
44
+
45
+ ```SQL
46
+
47
+ with tbl as (
48
+
49
+ select *
50
+
51
+ from (values
52
+
53
+ ('太郎',40,30,20,10)
54
+
55
+ ,('次郎',30,20,10,40)
56
+
57
+ ,('三郎',40,30,20,10)
58
+
59
+ ,('四郎',40,30,20,10)
60
+
61
+ ,('五郎',30,20,10,40)
62
+
63
+ ,('六郎',10,40,30,20)
64
+
65
+ ) as w(名前,要素①,要素②,要素③,要素④)
66
+
67
+ )
68
+
69
+ select 要素No, 要素件数
70
+
71
+ from (
72
+
73
+ select sum(case when 要素① = greatest(要素①,要素②,要素③,要素④) then 1 else 0 end) as 要素①
74
+
75
+ , sum(case when 要素② = greatest(要素①,要素②,要素③,要素④) then 1 else 0 end) as 要素②
76
+
77
+ , sum(case when 要素③ = greatest(要素①,要素②,要素③,要素④) then 1 else 0 end) as 要素③
78
+
79
+ , sum(case when 要素④ = greatest(要素①,要素②,要素③,要素④) then 1 else 0 end) as 要素④
80
+
81
+ from tbl
82
+
83
+ ) t
84
+
85
+ , unnest(array[要素①,要素②,要素③,要素④]::integer[]) with ordinality as u(要素件数, 要素No)
86
+
87
+ order by 要素件数 desc limit 3
88
+
89
+ ```
90
+
91
+ 元々は正規化されていない状態が、集計し辛い状況を作っているので、unnestを使用して一旦正規化し
92
+
93
+ て集計した場合は以下。
94
+
95
+ ```SQL
96
+
97
+ with tbl as (
98
+
99
+ select *
100
+
101
+ from (values
102
+
103
+ ('太郎',40,30,20,10)
104
+
105
+ ,('次郎',30,20,10,40)
106
+
107
+ ,('三郎',40,30,20,10)
108
+
109
+ ,('四郎',40,30,20,10)
110
+
111
+ ,('五郎',30,20,10,40)
112
+
113
+ ,('六郎',10,40,30,20)
114
+
115
+ ) as w(名前,要素①,要素②,要素③,要素④)
116
+
117
+ )
118
+
119
+ select 要素NO, count(*) as 件数
120
+
121
+ from (
122
+
123
+ select *, max(要素) over(partition by 名前)=要素 as 最大要素
124
+
125
+ from (
126
+
127
+ select 名前, 要素No, 要素
128
+
129
+ from tbl, unnest(array[要素①,要素②,要素③,要素④]::integer[]) with ordinality as u(要素, 要素No)
130
+
131
+ ) nomalize
132
+
133
+ ) pick_max
134
+
135
+ where 最大要素
136
+
137
+ group by 要素No
138
+
139
+ order by count(*) desc limit 3
140
+
141
+ ```