(答) 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 ; 0005NAME IS NULL2019/05/23(木) 20:36:39.27ID:??? よくある質問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 ; 0006NAME IS NULL2019/05/23(木) 20:40:07.78ID:??? よくある質問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によって文法がかなり違うので注意 0007NAME IS NULL2019/05/23(木) 20:41:16.91ID:??? よくある質問4
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ならこれを適当に改変すれば動きますが どのみちお奨めしません。 0009NAME IS NULL2019/05/23(木) 20:44:50.22ID:??? 以上、テンプレ終わり 0010NAME IS NULL2019/05/25(土) 01:14:38.34ID:1nV7ZQjK 空文字列を入れたがるやつにかぎって、レコードによっては空文字列だったり、NULLだったりと両方想定してないといけない設計にして、運用ではまる。 0011NAME IS NULL2019/05/25(土) 01:39:12.17ID:??? 苦労しているんだね 同情します 0012NAME IS NULL2019/05/25(土) 06:44:36.96ID:LBGwosS9 SQLじゃなくてテーブル設計の質問なんですが、お願いします。
答える人は同じなんだろうけどね 0019NAME IS NULL2019/05/25(土) 13:46:20.37ID:Z+RZPCej 縦横問題はRDBができて以来定番の課題&質問になってるな PIVOTとかも使いにくいしいい加減DBMS側でうまいことしてほしいところ 0020NAME IS NULL2019/05/26(日) 00:42:51.61ID:??? 今なら 「ラクテンスーパーポイントスクリーン」 登録するだけでRポイント150pが貰える!
※Androidアプリのみ iPhoneユーザーはWeb版から登録のみ可能
登録完了後に表示される招待コ一ドをお持ちですか?のところで 「i9WPjs」 を入力する
完了
祭りだ♪ヽ('∀')メ('∀')メ('∀')ノワッショイ 0021NAME IS NULL2019/05/26(日) 03:38:10.70ID:2BWK9yiY>>14 あなたは30年前からタイムマシンに乗ってやってきたのですか? 0022NAME IS NULL2019/05/29(水) 11:13:10.13ID:???>>21 30年前でもその設計はしないと思う 0023NAME IS NULL2019/05/31(金) 19:07:06.33ID:??? たまには30年先から来た人に話を聞いてみたい 0024NAME IS NULL2019/05/31(金) 23:38:45.60ID:5a1yvLIB>>23 過去には行けるが未来には行けない。これが現代の常識。 0025NAME IS NULL2019/05/31(金) 23:48:27.72ID:??? それだとおかしくなる 0026NAME IS NULL2019/06/01(土) 00:31:01.74ID:bltHuGZw>>25 逆にだった。時間の流れが遅いところにいると、時間の流れが速いところに戻ったときに未来にたどりつく。 0027NAME IS NULL2019/06/01(土) 01:34:20.85ID:??? 現在から過去に行けるなら、未来人が現在に来ることは可能だな
現代の常識だとそうなる 0028NAME IS NULL2019/06/02(日) 23:01:40.17ID:??? ここSQLスレじゃなくなったん? 0029NAME IS NULL2019/06/03(月) 21:16:01.14ID:??? SQLスレですね 0030NAME IS NULL2019/07/13(土) 19:26:52.20ID:AJIqdE5u 今更だが、SQLの正しい記述ってのはあるのか? 0031NAME IS NULL2019/07/13(土) 20:51:42.24ID:??? 今更だが、正しさとはなんだ? 0032NAME IS NULL2019/07/13(土) 20:54:06.41ID:??? アメリカが正義だ 0033NAME IS NULL2019/07/13(土) 21:24:45.64ID:??? 標準SQLがBNF記法でまとめられてるサイト https://ronsavage.github.io/SQL/0034NAME IS NULL2019/07/13(土) 21:47:23.70ID:???>>30 SQL:2016とかの規格の話? 0035NAME IS NULL2019/07/14(日) 08:50:25.15ID:KDHP+Bri>>34 はい。 0036NAME IS NULL2019/07/28(日) 18:04:41.02ID:???https://i.imgur.com/QvQTuqJ.jpg0037NAME IS NULL2019/07/29(月) 21:32:16.54ID:??? 点数テーブル 名前 日付 点数 A 7/27 50 A 7/28 70 B 7/27 80 B 7/28 90
本当は例よりもjoinjoinしていて複雑なので、文も大分長くなってますしこれでいいのか不安になってます 0038NAME IS NULL2019/07/29(月) 21:38:08.33ID:??? 普通にleftjoinして加算すれば 0039NAME IS NULL2019/07/29(月) 21:48:46.85ID:??? ありがとうございます! +で繋げたら普通に足し算できたんですね・・・お恥ずかしい ゲタのほうに該当がなかった場合点数+NULLみたいにならないか不安ですが試してみます! 0040NAME IS NULL2019/07/30(火) 00:01:05.07ID:??? COALESCEなりCASEなりでNULLを0にすればいいんでない? 0041NAME IS NULL2019/07/30(火) 06:42:33.83ID:???>>39 isnullつかえば 0042NAME IS NULL2019/07/31(水) 22:15:14.94ID:??? 37の意図する事が今一分からないだが、 単純に点数テーブルとゲタテーブルをマージして Group by して sum取っちゃ拙いのか?
MySQLだとこんな具合で select `名前`,`日付`,sum(`点数`) from ( select `名前`,`日付`,`点数` from `点数テーブル` union select `名前`,`日付`,`点数` from `ゲタテーブル` ) g group by `名前`,`日付`; 0043NAME IS NULL2019/07/31(水) 22:32:34.75ID:???>>37がやってるってのがそれだろ。 しかも>>37は正しくunion all使ってるのにお前は間違えてるし。 0044NAME IS NULL2019/07/31(水) 22:35:57.00ID:???>>43 あ、すまんな、その通りだ 0045NAME IS NULL2019/08/01(木) 08:09:51.16ID:??? まあunionでもいいと思うが万が一ゲタ側のレコードに対応するレコードが点数テーブルにない時もレコード出力されちゃうから俺ならleft joinでやると思う 0046NAME IS NULL2019/08/01(木) 20:10:22.24ID:???>>37です。皆さんありがとうございます。参考になります その後、LEFT JOINで書いたのですが、 点T A 7/30 70 B 7/30 80
ゲタT A 7/30 +10 A 7/30 -5 B 7/30 -10 というように、ゲタの対応するレコードが1件だけではなかったらしく 普通にLEFT JOINすると A 7/30 80 A 7/30 65 B 7/30 70 のように複数行になってしまいました
@ SELECT 人, 日, 点+ゲタ計 FROM 点T LEFT JOIN ( SELECT 人, 日, SUM(ゲタ) FROM ゲタT GROUP BY 人, 日 ) ON 点T.人 = ゲタT.人 AND 点T.日 = ゲタT.日
A SELECT 人, 日, 点+ゲタの合計 FROM ( SELECT 人, 日, 点, SUM(ゲタ) FROM 点T LEFT JOIN ゲタT ON 点T.人 = ゲタT.人 AND 点T.日 = ゲタT.日 GROUP BY 人, 日, 点 )
見づらく恐縮なのですが、よろしくお願いします 0047NAME IS NULL2019/08/01(木) 22:23:33.88ID:??? 2番目のgroup by はやばい. 正誤で言えば、1番目が正しい 0048NAME IS NULL2019/08/02(金) 06:39:22.62ID:??? ゲタハカセスギw 0049NAME IS NULL2019/08/02(金) 09:43:54.13ID:??? ありがとうございます! 確かにAはおかしかったですね・・・ @のほうで書いてみたいと思います ありがとうございました! 0050NAME IS NULL2019/08/02(金) 22:05:00.81ID:??? サブクエリする必要はないけど Aも別に間違いじゃないけどな SELECT 人, 日, 点+SUM(ゲタ) FROM 点T LEFT JOIN ゲタT ON 点T.人 = ゲタT.人 AND 点T.日 = ゲタT.日 GROUP BY 人, 日, 点 0051sage2019/08/03(土) 13:02:52.10ID:wjgyF6r3>>47 なにがやばくてどう間違ってるのか詳しく
どう書いてもまあいいんだが、気になるなら実際のテーブル(インデックス)構成と件数で実行計画取ってみれ 0052NAME IS NULL2019/09/01(日) 09:35:29.97ID:??? date player score weekAve 2019-09-01 A 80 ? 2019-09-01 B 67 ? 2019-09-01 C 91 ? 2019-08-31 A 78 ? 2019-08-31 B 65 ? 2019-08-31 C 93 ? 2019-08-30 A 81 ? 2019-08-30 B 69 ? 2019-08-30 C 90 ?
…
というようなデータで、各プレイヤーのその日付段階での 直前1週間の平均scoreをweekAveのところに入れる方法をお願いします。 0053NAME IS NULL2019/09/01(日) 16:47:32.11ID:??? sqliteで作ったので適当になおしてくれ
select tb1.col1,tb1.col2,max(tb1.col3),avg(tb2.col3) from tb1 left outer join tb1 as tb2 on tb2.col2=tb1.col2 and date(tb2.col1)>=date(tb1.col1, '-7 days') and date(tb2.col1)<=date(tb1.col1) group by tb1.col1,tb1.col2 ; 0054522019/09/01(日) 17:52:32.35ID:???>>53 大変ありがとうございました。 使わせていただきます。 0055NAME IS NULL2019/09/20(金) 14:25:08.89ID:??? name, datetime, comment のテーブルでnameとdatetime で主キーとしています。 nameが重複しているものだけをリストアップするにはどうすればよいでしょうか。
A 2019/9/20 0:0 AAA1 B 2019/9/20 0:5 BBB1 C 2019/9/20 0:5 CCC1 A 2019/9/20 1:0 AAA2 C 2019/9/20 1:5 CCC2 A 2019/9/20 2:0 AAA3
の場合以下を期待します。
A 2019/9/20 0:0 AAA1 A 2019/9/20 1:0 AAA2 A 2019/9/20 2:0 AAA3 C 2019/9/20 0:5 CCC1 C 2019/9/20 1:5 CCC2
以下のSQL文で実現できますが、もっとスマートな方法はないでしょうか?
select * from xxx where name in ( select name from (select name, count(*) as cnt from xxx group by name) where cnt > 1 ) order by name, datetime 0056NAME IS NULL2019/09/20(金) 16:17:33.29ID:??? HAVING使うぐらいか?
SELECT * FROM xxx WHERE name IN ( SELECT name FROM xxx GROUP BY name HAVING 1<COUNT(*) ) ORDER BY name, datetime 0057NAME IS NULL2019/09/20(金) 16:43:23.46ID:???>>56 出来ました! group by はhaving でしたね。 ありがとうございました。 0058NAME IS NULL2019/09/20(金) 18:25:52.08ID:??? こんなんでいいだろ
select * from xxx T1 where exists ( select * from xxx T2 where T1.name = T2.name and T1.datetime <> T2.datetime ) 0059NAME IS NULL2019/09/21(土) 16:28:13.26ID:??? これはありえないw 0060NAME IS NULL2019/09/21(土) 17:16:57.39ID:??? テーブルのレコード数が多くてnameのカーディナリティも十分高いなら 一般には>>56より>>58の方が良いだろ。 0061NAME IS NULL2019/09/21(土) 19:24:27.30ID:8nH6piRt DBMSとデータ量で実測してみないとわからんな。 NoSQL系なら58の方が速そう RDBなら56を改変して SELECT L.* FROM xxx L JOIN (SELECT name FROM xxx GROUP BY name HAVING 1<COUNT(*)) R ORDER BY L,name, L,datetime の方が速いかも 0062NAME IS NULL2019/09/21(土) 20:59:51.16ID:??? 日時が同じデータはありえないという条件をいわれてないなら 普通はこんなsqlはかけないわw 0063NAME IS NULL2019/09/21(土) 21:17:13.99ID:??? > nameとdatetime で主キーとしています。 0064NAME IS NULL2019/09/21(土) 21:52:58.94ID:???>>61 環境によるから実際に実行計画をみてみなきゃ確実なことは言えないのはその通りだけど、 そのsqlはサブクエリでfull scan 1回、外側で1回、nameのカーディナリティが高ければ 中間データも大きくなり、しかもJOINにインデックスが使われないときているから、 メモリに入りきらないようなテーブルの場合は極端に遅くなりそう。 0065NAME IS NULL2019/09/21(土) 22:28:07.41ID:??? nameのカーディナリティが高い場合、>>56や>>61では中間データが大きくなり メモリに乗り切らないことが考えられ、>>58のほうが速い可能性がある。
nameのカーディナリティが低い場合、>>58ではexistsの条件に早くひっかかる 可能性が大きくなり、やはり>>58のほうが速い可能性がある。 0066NAME IS NULL2019/09/21(土) 22:58:15.28ID:???>>58は相関サブクエリにインデックスが使われ、datetimeの比較は2エントリ目で 必ず判断がつくから、実のところ速度はカーディナリティにあまり影響されない。 0067NAME IS NULL2019/09/22(日) 04:36:57.50ID:??? PostgreSQL 9.6.11 にて1000000行のデータでEXPLAIN ANALYZEを付けて実行してみた。データは https://ideone.com/WTthGi のようにして作成。 各8回実行し、最初の4回は捨てた。
>>55 PostgreSQLでは副問合せに名前を付けないとエラーになるため AS a を追加 Execution time: 1202.286 ms / 1173.974 ms / 1194.647 ms / 1221.041 ms
>>56 Execution time: 1164.661 ms / 1171.337 ms / 1210.060 ms / 1179.993 ms
>>58 order by name, datetimeを追加 Execution time: 2350.302 ms / 2320.161 ms / 2345.047 ms / 2368.932 ms
>>61 R の後にON L.name=R.nameを追加、ORDER BYの,を.に変更 Execution time: 1248.337 ms / 1215.495 ms / 1222.694 ms / 1222.818 ms
↑はDBや環境、実際のデータ、インデックスの追加で変わると思う。 0068NAME IS NULL2019/09/22(日) 11:03:21.51ID:oC+qLfZI>>67 素晴らしい。結局最初のであまり問題ないね 最近はよっぽど遅い場合を除いて 意図が分かるように書くのがいい感じよね 0069NAME IS NULL2019/10/01(火) 22:47:53.79ID:yfemt3Lz すいません 教えてください… カラムは2つです(アクセスログです) IP CGI
複数種類あるCGIに対してどのCGIに このIPからは何回、このIPからは何回アクセスされたというのを集計したいのですが SQLが思いつきません… だれか教えてください… 0070NAME IS NULL2019/10/01(火) 23:20:09.22ID:???>>69 一旦各CGIがLogに出力して 日替わりや週替わり月替わりで集計したらどうか 0071NAME IS NULL2019/10/02(水) 09:28:22.87ID:???>>69 select CGI,IP,count(*) from テーブル group by CGI,IP; 0072NAME IS NULL2019/10/07(月) 18:48:19.40ID:??? Windowsでデータベースを使いたく、今xamppをインストールして、PHPから学んでる最中なのですが、 mySQL(実際はMariaDB)で作ろうと考えていたのですが、私の目的のデータベースが作れるのか、調べてもなかなか出てこなくて、 ひょっとすると、リレーショナルデータベースでは出来ないのでは?と薄く疑問に思ってるのですが、、以下のデータベースを作ることは可能でしょうか?
このように、変化がある時点のみを抽出したいのですが、 どのようなSQLが考えられますか? 0081NAME IS NULL2019/10/13(日) 18:53:50.12ID:???>>80 SQL-Server select dates.date1 as date1, sum(coalesce(table1.guests, 0)) as guests from table1 right join ( select startdate as date1 from table1 union select enddate as date1 from table1 ) dates on table1.startdate <= dates.date1 and dates.date1 < table1.enddate group by dates.date1 order by dates.date1 0082NAME IS NULL2019/10/14(月) 13:54:43.52ID:???>>81 ありがとうございました。 0083NAME IS NULL2019/10/27(日) 15:00:48.42ID:??? 以下のURLのSQL練習サイトで勉強しているのですが 調べてもわからなかった問題があるので押してください。
上の自己相関サブクエリと、以下のSQLで何か違いがあれば教えてください。 (例えば、以下のSQLの場合、件数が数万件に及ぶと実行速度が極端に遅くなる等) select continent,name,area from world where area in (select max(area) from world group by continent)
よろしくお願いいたします。
0084NAME IS NULL2019/10/28(月) 00:43:36.69ID:6SIOZDZ3>>83 解釈としてはxとyの突き合わせだが DBMSによってどう最適化するかは異なるから 実際は実行計画を見てみるしかない。 そのサイトの裏側が何だかわからないので手元で実行計画を見てみるといい https://www.atmarkit.co.jp/ait/articles/0408/25/news101.html0085NAME IS NULL2019/10/31(木) 02:56:13.58ID:taiLajBl>>83 簡潔に指摘するとALL句の意味を取り違えています。
ALL句の副問い合わせは同じ大陸内の国ごとの面積を返します。
area >= ALL は (area >= 面積1 AND area >= 面積2 AND area >= 面積3) のようなものです。つまりこの場合は一番大きい面積とarea列値を比べることになります。
あなたが考えた処理方法では、@はともかくA〜Dを行っていまうと、最大の国だけでなく、同じ大陸の他のレコードまで取得してしまいます。 0086NAME IS NULL2019/11/09(土) 06:00:59.81ID:??? table1 親品番,子品番 table2 品番,品名
取り出したい内容 親品番,親品名,子品番,子品名
table1,2のjoinでON句に親品番=品番や子品番=品番とすると片方ずつは取得できますが、両方同時に取得することはできますか? 0087NAME IS NULL2019/11/09(土) 08:41:59.09ID:??? table1ひとつにtabl2をふたつJOINしてやればいいんだよ 0088NAME IS NULL2019/11/09(土) 10:19:33.50ID:???>>87 ありがとうございます 週明けに試してみます 0089NAME IS NULL2019/11/09(土) 11:12:26.19ID:af/bSZEC いかにも初心者らしい質問ですね 0090NAME IS NULL2019/12/24(火) 16:02:18.63ID:??? SQL Server 2014です。
文字列検索で、半角濁音および半角半濁音を含むかどうか調べたいです。 ただ普通に LIKE '%゙%' と検索すると全件ヒットしてしまいます。 照合順序で区別をしてもダメでした。
どうすればいいのでしょうか?(´・ω・`) 0091NAME IS NULL2019/12/24(火) 20:19:09.24ID:joe7BHe1>>90 おそらく半角の濁点、半濁点が無視さらているのでしょう。
まずは自分が見ている濁点、半濁点の文字コードを調べてください。 0092NAME IS NULL2019/12/24(火) 20:55:24.36ID:??? 照合順序なにでやってだめだったんだよ バイナリ系のやつならいける気がするけど 0093NAME IS NULL2019/12/24(火) 21:29:38.72ID:joe7BHe1 キャラクタセットも自分で調べないようでは話にならない。 0094NAME IS NULL2019/12/24(火) 21:31:04.18ID:joe7BHe1 条件が半角カタカナ文字だったらどうなるのか書いてくれよ。
エスパーじゃないからわかんねえよ! 0095NAME IS NULL2019/12/24(火) 22:30:40.39ID:??? many to manyって中間テーブルつかわなあらわせないの? 0096NAME IS NULL2019/12/24(火) 22:37:11.00ID:??? べつに中間じゃなくてもいいよ。 0097NAME IS NULL2019/12/24(火) 22:53:42.19ID:??? どうやんの? 0098NAME IS NULL2019/12/25(水) 08:01:52.36ID:??? create table T ( a, b, unique(a, b) )
これがaとbのmany to many 0099NAME IS NULL2019/12/25(水) 09:58:53.56ID:???>>92 ありがとうございます。 照合順序で、てっきりCS・AS・KS・WSしか頭に入ってませんでした。 BINで判別できました。 0100NAME IS NULL2019/12/25(水) 10:09:08.06ID:H+1gr7tn マイク製品は大文字、小文字、全角、半角文字を同じのみなすからなあ。