(答) select A.ID, A.DATE, A.DATA from TableName A inner join (select ID, max(DATE) as MAX_DATE from TableName group by ID ) B on A.ID = B.ID and A.DATE = B.MAX_DATE ; 0004NAME IS NULL垢版2018/01/04(木) 22:15:39.02ID:??? よくある質問2
(問) key data ---------------- 1 a 1 a 1 b 1 b 1 a 2 b 2 a 2 a
(答) select key, SUM(CASE data WHEN 'a' THEN 1 END) AS a, SUM(CASE data WHEN 'b' THEN 1 END) AS b FROM table GROUP BY key ORDER BY key ; 0005NAME IS NULL垢版2018/01/04(木) 22:16:40.08ID:??? よくある質問3
(問) ID HOGE 01 A 01 B 01 C 02 A 03 B
HOGEをAもBもCも持っている、ID:01だけ取り出すにはどうすればよかですか
(答1) select id FROM TableName WHERE hoge in ('A','B','C') GROUP BY id HAVING count(DISTINCT hoge) = 3 ;
(答2) select * from TableName T1 where not exists (select * from (values 'A', 'B', 'C') T2 (HOGE) where not exists (select * from TableName T3 where T1.ID = T3.ID and T2.HOGE = T3.HOGE ) ) ; ※valuesの部分(Table Value Constructor)はDBMSによって文法がかなり違うので注意 0006NAME IS NULL垢版2018/01/04(木) 22:17:39.88ID:??? よくある質問4
(答) SQLでは存在しないデータを生成することはできません。 この問いの場合は素直にカレンダーテーブルを用意しましょう。 0009NAME IS NULL垢版2018/01/05(金) 02:47:19.49ID:??? よくある質問5
with TEMP (NUM) as ( select 1 from dual union all select NUM + 1 from TEMP where NUM < 31 ) select to_char(to_date('201006', 'YYYYMM') + NUM - 1, 'YYYYMMDD') from TEMP where to_date('201006', 'YYYYMM') + NUM - 1 < add_months(to_date('201006', 'YYYYMM'), 1) ;
※上記はOracleの場合です。(11gR2以降) ※再帰問合せをサポートするDBMSならこれを適当に改変すれば動きますが どのみちお奨めしません。 0010NAME IS NULL垢版2018/01/05(金) 02:49:13.40ID:??? よくある質問5 (後半の訂正)
with TEMP (NUM) as ( select 1 from dual union all select NUM + 1 from TEMP where NUM < 31 ) select to_char(to_date('201006', 'YYYYMM') + NUM - 1, 'YYYYMMDD') from TEMP where to_date('201006', 'YYYYMM') + NUM - 1 < add_months(to_date('201006', 'YYYYMM'), 1) ;
※上記はOracleの場合です。(11gR2以降) ※再帰問合せをサポートするDBMSならこれを適当に改変すれば動きますが どのみちお奨めしません。 0011NAME IS NULL垢版2018/01/05(金) 02:50:38.56ID:??? いちおつ generate_series()関数がダメみたいだな 0012NAME IS NULL垢版2018/01/05(金) 21:56:46.58ID:??? 前スレ971の回答でも貼っとくか
select T5."T3_ID" "ID", T5."T3_日付" "日付", T5."T3_値" "値", T5."T4_日付" "求めたい日付" from (select T3."ID" "T3_ID", T3."日付" "T3_日付", T3."値" "T3_値", T4."T2_日付" "T4_日付", row_number() over (partition by T3."ID", T3."日付" order by T4."T1_日付" desc) "日付順" from "TableName" T3 left outer join (select T1."ID" "T1_ID", T1."日付" "T1_日付", T2."日付" "T2_日付", row_number() over (partition by T1."ID", T1."日付" order by T2."値" desc) "値順" from "TableName" T1 inner join "TableName" T2 on T1."ID" = T2."ID" and T2."日付" between add_months(T1."日付", -12) and T1."日付" ) T4 on T3."ID" = T4."T1_ID" and T3."日付" > T4."T1_日付" where T4."値順" = 1 or T4."値順" is null ) T5 where T5."日付順" = 1 order by 1,2,3 ; 0013NAME IS NULL垢版2018/01/06(土) 14:50:55.67ID:??? なるほど 全然速そうだな 0014NAME IS NULL垢版2018/01/06(土) 15:46:57.99ID:Os9t48kn なんでそんな変なのばっかりなの? ソートが頭から離れないのか。 0015NAME IS NULL垢版2018/01/07(日) 01:11:19.54ID:???>>13 パーティション切ってrow_numberで先頭行だから オプティマイザの出来次第だけどパフォーマンスに大差はないと思うけど 相関サブクエリとjoinなら同じ実行計画はいたりするし
>>14 はいはい どうせ正解は書かないんじゃなくて書けないんでしょ 0016NAME IS NULL垢版2018/01/07(日) 10:01:46.51ID:yu9dE7vj なんというレベルの低さ 0017NAME IS NULL垢版2018/01/07(日) 12:26:12.96ID:??? >全然速そうだな
変な日本語を何とかしろよ 0018NAME IS NULL垢版2018/01/07(日) 14:04:49.83ID:yu9dE7vj>>15 >>3 を見たのか? 0019NAME IS NULL垢版2018/01/25(木) 18:41:52.80ID:heRfYWvO mysqlでサブクエリを asに代入するとき、常に1カラムしかasできないため サブクエリだらけになってしまうのですが、これをスマートに1サブクエリとかで取得できませんでしょうか?
SELECT ( SELECT max(num) FROM sub_table ) as max_num , ( SELECT min(num) FROM sub_table ) as min_num, ( SELECT avg(num) FROM sub_table ) as avg_num FROM main_table ↑main_tableに sub_tableの min max avgを盛り込もうとすると サブクエリだらけになってしまう。