** 解決策反映 **
前提・実現したいこと
・使用環境:PstgreSQL v.9.5
・もはや、タイトルの通り。。。。SQLでSELECTしたい結果例を示しますので、そちらを参考に
・テーブルにGROUP BY でCOUNT出来る数と同じ感じにseqを付けたい
SQL内でsequenceを付けたい!
カラムAとカラムBが一致する、カラムC毎に連番を振る
※テーブルでユニークな連番ではなく、特定データグループ内での連番
table:item_use_history(使う対象テーブル:こいつをゴネゴネしたい)
id | user_id | datetime | item_id | value |
---|---|---|---|---|
1 | 101 | 2019/09/01 10:10:10 | 1 | aaa1 |
2 | 102 | 2019/09/01 10:10:10 | 1 | aaa2 |
3 | 103 | 2019/09/01 10:10:10 | 1 | aaa3 |
4 | 101 | 2019/09/01 11:10:10 | 2 | bbb1 |
5 | 102 | 2019/09/01 11:10:10 | 2 | bbb1 |
6 | 103 | 2019/09/01 11:10:10 | 2 | bbb2 |
7 | 101 | 2019/09/01 12:10:10 | 1 | ccc1 |
8 | 102 | 2019/09/01 12:10:10 | 1 | ccc2 |
9 | 103 | 2019/09/01 12:10:10 | 1 | ccc3 |
select:goal_result(サブクエリで作成したい表)
最終結果...は、ただSELECTとJOINする想定なので、
実質は、下の表が作れるサブクエリを教えて欲しいです
seq箇所を何とか出したい。。。
id | user_id | datetime | item_id | value | seq |
---|---|---|---|---|---|
1 | 101 | 2019/09/01 10:10:10 | 1 | aaa1 | 1 |
2 | 102 | 2019/09/01 10:10:10 | 1 | aaa2 | 1 |
3 | 103 | 2019/09/01 10:10:10 | 1 | aaa3 | 1 |
4 | 101 | 2019/09/01 11:10:10 | 2 | bbb1 | 1 |
5 | 102 | 2019/09/01 11:10:10 | 2 | bbb1 | 1 |
6 | 103 | 2019/09/01 11:10:10 | 2 | bbb2 | 1 |
7 | 101 | 2019/09/01 12:10:10 | 1 | ccc1 | 2 |
8 | 102 | 2019/09/01 12:10:10 | 1 | ccc2 | 2 |
9 | 103 | 2019/09/01 12:10:10 | 1 | ccc3 | 2 |
select:try_result(まず、カウントしてみましたの結果表)
user_id | use_date | item_id | count(item_id) |
---|---|---|---|
101 | 2019/09/01 | 1 | 2 |
102 | 2019/09/01 | 1 | 2 |
103 | 2019/09/01 | 1 | 2 |
101 | 2019/09/01 | 2 | 1 |
102 | 2019/09/01 | 2 | 1 |
103 | 2019/09/01 | 2 | 1 |
### 直面している課題 |
SQLが思いつかない。。。知恵を貸してください!
該当のソースコード
** goal_result **
これは書きかけ。。。まだ、想像すら出来ていないっす。
こんな感じで出来ました
SQL
1WITH item_count AS ( 2 SELECT *, RANK() OVER (PARTITION BY i.use_date, i.user_id, i.item_id ORDER BY i.datetime) AS seq 3 FROM ( 4 SELECT 5 item.*, 6 TO_CHAR(item.datetime::TIMESTAMP, 'YYYY/MM/DD') AS use_date 7 FROM 8 item_use_history AS item 9 WHERE 10 item.datetime BETWEEN ('2019/09/01 00:00:00' AND '2019/09/30 23:59:59') 11 ) AS i 12 WHERE TRUE =TRUE 13 --GROUP BY 14 --ORDER BY 15) 16SELECT * 17FROM item_count 18WHERE TRUE = TRUE 19--GROUP BY 20--ORDER BY
** try_result **
これは、普通にできる。。。
SQL
1SELECT 2 item.user_id, 3 TO_CHAR(item.datetime::TIMESTAMP, 'YYYY/MM/DD') AS use_date, 4 item.item_id, 5 count(item_id) 6FROM 7 item_use_history AS item 8WHERE 9 i.datetime BETWEEN ('2019/09/01 00:00:00' AND '2019/09/30 23:59:59') 10GROUP BY 11 item.user_id, use_date, item.item_id 12ORDER BY 13 use_dateASC, 14 item.user_id ASC, 15 item.item_id ASC,
調べている情報
row_number() over()
これを調べているところ
過不足あれば、コメントくださいませ
最終的なゴール
こんな表にしたい!!
user_id | use_date | item_id | seq_1 | seq_1_value | seq_2 | seq_2_value | ... |
---|---|---|---|---|---|---|---|
101 | 2019/09/01 | 1 | 1 | aaa1 | 2 | ccc1 | ... |
102 | 2019/09/01 | 1 | 1 | aaa2 | 2 | ccc1 | ... |
103 | 2019/09/01 | 1 | 1 | aaa3 | 2 | ccc1 | ... |
101 | 2019/09/01 | 2 | 1 | bbb2 | NULL | NULL | ... |
102 | 2019/09/01 | 2 | 1 | bbb2 | NULL | NULL | ... |
103 | 2019/09/01 | 2 | 1 | bbb2 | NULL | NULL | ... |
なので、その前にこんな感じに出せるようにサブクエリを作る!
で。。。固まっています。
回答2件
あなたの回答
tips
プレビュー