(答) 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 NULL2018/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 NULL2018/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 NULL2018/01/04(木) 22:17:39.88ID:??? よくある質問4
(答) SQLでは存在しないデータを生成することはできません。 この問いの場合は素直にカレンダーテーブルを用意しましょう。 0009NAME IS NULL2018/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 NULL2018/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 NULL2018/01/05(金) 02:50:38.56ID:??? いちおつ generate_series()関数がダメみたいだな 0012NAME IS NULL2018/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 NULL2018/01/06(土) 14:50:55.67ID:??? なるほど 全然速そうだな 0014NAME IS NULL2018/01/06(土) 15:46:57.99ID:Os9t48kn なんでそんな変なのばっかりなの? ソートが頭から離れないのか。 0015NAME IS NULL2018/01/07(日) 01:11:19.54ID:???>>13 パーティション切ってrow_numberで先頭行だから オプティマイザの出来次第だけどパフォーマンスに大差はないと思うけど 相関サブクエリとjoinなら同じ実行計画はいたりするし
>>14 はいはい どうせ正解は書かないんじゃなくて書けないんでしょ 0016NAME IS NULL2018/01/07(日) 10:01:46.51ID:yu9dE7vj なんというレベルの低さ 0017NAME IS NULL2018/01/07(日) 12:26:12.96ID:??? >全然速そうだな
変な日本語を何とかしろよ 0018NAME IS NULL2018/01/07(日) 14:04:49.83ID:yu9dE7vj>>15 >>3 を見たのか? 0019NAME IS NULL2018/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を盛り込もうとすると サブクエリだらけになってしまう。 0020NAME IS NULL2018/01/25(木) 19:27:52.27ID:??? これでそのSQLと同じ意味にはなる 何がしたいのかはよくわからんが
select sub.* from (select max(num) as max_num, min(num) as min_num, avg(num) as avg_num from sub_table ) sub cross join main_table ; 0021192018/01/26(金) 09:39:10.20ID:IngnXOhQ>>20 ありがとうございます!! 0022NAME IS NULL2018/01/26(金) 12:43:24.38ID:pxozcjcA 自作自演? 0023NAME IS NULL2018/01/26(金) 17:32:37.75ID:??? どうしてそう思ったの? 0024NAME IS NULL2018/01/26(金) 20:18:17.38ID:??? 感謝ぐらい好きにさせてやれよ歪んでるなあ 0025NAME IS NULL2018/01/28(日) 15:06:04.05ID:Qiu5BIxt 明らかに情報不足なのに情報を補完して回答しているからな。 0026NAME IS NULL2018/01/28(日) 17:13:34.73ID:27cZ5HqG それはキミ、情報不足やない、キミの知識不足やろ。 0027NAME IS NULL2018/01/28(日) 18:21:25.57ID:qkfYCnFE>>26 メインテーブルとサブテーブルの結合条件がクロスジョインとは普通、思わない。 0028NAME IS NULL2018/01/28(日) 18:34:16.20ID:???>>27 > メインテーブルとサブテーブルの結合条件がクロスジョイン え? 0029NAME IS NULL2018/01/28(日) 18:55:59.94ID:???>>19のSQLがクロスジョインだと思えないのは知識不足としか言いようがない 0030NAME IS NULL2018/01/28(日) 19:07:37.13ID:???>>20は何も補完」してないだろ。逆に>>19の意味不明な部分はそのまま字面通り解釈して回答してる。 0031NAME IS NULL2018/01/28(日) 19:16:59.64ID:???>>29 main_table と「sub_table」の cross join だと思ってるなら知識不足以前の話かとww 0032NAME IS NULL2018/01/30(火) 17:05:33.92ID:??? やりすぎ防犯パトロール、特定人物を尾行監視 2009年3月19日19時7分配信 ツカサネット新聞 http://headlines.yahoo.co.jp/hl?a=20090319-00000026-tsuka-soci