X



トップページDB@2ch掲示板
1002コメント330KB
SQL質疑応答スレ 17問目 [無断転載禁止]©2ch.net
レス数が1000を超えています。これ以上書き込みはできません。
0001NAME IS NULL2016/07/10(日) 22:29:01.40ID:???
このスレは
「こういうことをやりたいんだけどSQLでどう書くの?」
「こういうSQLを書いたんだけどうまく動きません><」
などの質問を受け付けるスレです。

SQLという言語はISOによって標準化されていますが
この標準を100%実装したDBMSは存在せず、
また、DBMSによっては標準でない独自の構文が
追加されていることもあります。

質問するときはDBMS名を必ず付記してください。

【質問テンプレ】
・DBMS名とバージョン
・テーブルデータ
・欲しい結果
・説明

前スレ:
SQL質疑応答スレ 16問目
http://echo.2ch.net/test/read.cgi/db/1447160858/
0952NAME IS NULL2017/12/14(木) 10:43:19.73ID:???
>>950
シリアライズしたテキストなんて曖昧なデータぶっこむのもOKだけど
RDB使ってんなら関係性重視したいよねっていう
0953NAME IS NULL2017/12/14(木) 18:55:46.58ID:W31f7YBM
>>952
お前がやりたいなら止めはしないけどお前が重視したいらしい関係性て
おそらく関係モデルの関係とはなんも関係ない関係性やでw
0954NAME IS NULL2017/12/15(金) 01:27:41.00ID:???
RDBじゃないDBMSの選択肢が極端に少ないって実情があるからな
0955NAME IS NULL2017/12/15(金) 02:37:31.20ID:???
>おそらく関係モデルの関係とはなんも関係ない関係性やでw
それはない
正規化から勉強しなおしだな
0956NAME IS NULL2017/12/15(金) 07:47:26.78ID:6QrkU8mN
>>955
いやあるからわざわざ言っとんのやでw
意固地のベイビーちゃんやなw
0957NAME IS NULL2017/12/15(金) 12:49:28.67ID:???
>>955
要件もはっきりしてないのに
> それはない
って言い切る奴はバカ認定してもいいかな?
0958NAME IS NULL2017/12/15(金) 15:11:25.84ID:???
しょせん他人事でどうでもいいことに熱くなるなよ
0959NAME IS NULL2017/12/15(金) 16:58:53.39ID:???
奇をてらわずに>>943でいいじゃんな
スループット確保したいとか入力値が無法地帯でモデリングしようがないとか
そういう時に初めて検討すりゃいい
0961NAME IS NULL2017/12/15(金) 17:18:42.86ID:???
KVS
 ID 1
 VALUE {
  "name": "山田太郎",
  "age": "35",
  "addr": "東京都",
  "attr": [
   
  ]
 }

これじゃRDBの意味がない
0962NAME IS NULL2017/12/15(金) 17:21:46.72ID:???
KVS
 ID: 1
 VALUE: "山田太郎"
 ID: 2
 VALUE: "35"
 ID: 3
 VALUE: "東京都"

にすると扱うのが却って難しい
0963NAME IS NULL2017/12/15(金) 21:41:32.93ID:???
>>960
えっ?
どこがブーメランなんだい?
ちょっと説明してみ
0964NAME IS NULL2017/12/25(月) 08:23:47.10ID:Xetk2Fg1
MariaDB(MySQL)で質問です
Userテーブルがあり、各ユーザーはpointというint型のフィールドがあります
このpointの合計がx以上になる分だけのユーザーをソートして取得したいと考えています

色々と調べたり試行錯誤してみましたが限界を感じましたので
どうか皆様の知恵をおかしください。よろしくお願いします
0965NAME IS NULL2017/12/25(月) 11:11:43.13ID:???
pointの合計ってなに?なんか計算をしたいの?

・Userテーブルがある
・各ユーザーはpointというフィールドを持つ

ちゃんとテーブルの構成を書かないとこれだけじゃよくわからない
0966NAME IS NULL2017/12/25(月) 16:20:46.40ID:???
ユーザーIDでgroup by し sumでpointを集計
order by ユーザーID
んでhavingで sum(point) > x
みたいな?
0967NAME IS NULL2017/12/25(月) 17:50:53.80ID:Xetk2Fg1
>>966
試してみます!
0968NAME IS NULL2017/12/29(金) 11:02:39.55ID:dtNZwIie
誰でも簡単にパソコン1台で稼げる方法など
参考までに、
⇒ 『宮本のゴウリエセレレ』 というブログで見ることができるらしいです。

グーグル検索⇒『宮本のゴウリエセレレ』

J7FO55UASR
0969NAME IS NULL2017/12/29(金) 17:11:12.15ID:???
>>968
でも、君あちこちにコピペしてて苦労してそうじゃん
もっと簡単に稼げるぞ
0970NAME IS NULL2017/12/31(日) 07:10:08.80ID:???
where 句のIN演算子の書き方ってモヤっとしない?
0971NAME IS NULL2018/01/01(月) 15:34:27.49ID:???
ID / 日付 / 値

という列があったとして(ID/日付でUNIQUE)、それぞれの各行に
「IDごとの前回の日付から遡って1年間の間に値が最大値となる日付」を付与するにはどうしたらいいでしょう?

A | 16-01-01 | 10
A | 16-11-01 | 20
A | 17-02-01 | 15
A | 17-12-01 | 10
A | 18-01-01 | 30
B | 17-03-01 | 15
B | 17-10-01 | 10
B | 17-11-01 | 20

とあったら、上からNULL、16-01-01、16-11-01、16-11-01、17-02-01、NULL、17-03-01、17-03-01が入るような列を追加するイメージです
Postgres使ってます
0972NAME IS NULL2018/01/01(月) 15:57:02.83ID:???
>>971
>前回の日付から遡って1年間の間

頭悪くて済まないが、この意味がよく分からない
0973NAME IS NULL2018/01/01(月) 16:20:06.66ID:???
>>972
言葉足らずでごめん
日付でソートした際の1つ前のレコードから遡って1年間

A | 16-01-01 | 10
A | 16-11-01 | 20

これだと、1行目はこの前の時点のデータがないからNULLで、
2行目のは1つ前のレコードである16-01-01から遡って1年間を集計期間にしたい
0974NAME IS NULL2018/01/01(月) 21:04:00.89ID:iMl2Nb4o
いきなり最終形にしようとするからわからないんだろうな。
0975NAME IS NULL2018/01/01(月) 21:30:53.28ID:???
少しずつ実現するのが近道部品を組み立てる組み立てるつもりで考えてみよう
09769712018/01/01(月) 22:29:55.07ID:???
SQLポンコツなんだ…
せめてヒントをくれるとありがたいです
0977NAME IS NULL2018/01/01(月) 22:36:14.85ID:g9MeygUN
ID列でグループ化、日付列がcountで2レコード以上のレコードを取得して、日付が最小のレコードを取得する。

あなたのためにあえてSQLは書かない。
0978NAME IS NULL2018/01/01(月) 23:05:35.41ID:???
>>971
sqlserverならこんな感じでできる
select * from (
select m.id ,m.日付,m.値,s.日付 as 最大値日付,row_number (partation by m.id,m.日付 order by m.値 desc) as 順
from テーブル as m
left join テーブル as s
on s.id = m.id
and s.日付 between deteadd (yy,-1,m.日付) and m.日付
) as mm
where 順 = 1
0979NAME IS NULL2018/01/01(月) 23:08:58.34ID:g9MeygUN
ひどい例
0980NAME IS NULL2018/01/02(火) 02:01:15.52ID:???
>>971
select *,
(select top 1 日付 from テーブル where テーブル.ID=前回の日付テーブル.id and テーブル.日付 <= 前回の日付テーブル.前回の日付 and テーブル.日付>DATEADD(yy,-1,前回の日付テーブル.前回の日付) order by 値 desc)
from(
select t.*,
(select top 1 日付 from テーブル where テーブル.ID=t.id and テーブル.日付 < t.日付 order by 日付 desc) as 前回の日付
from テーブル as t
) as 前回の日付テーブル

SQL Serverでやったけど、topと日付計算周りだけ直せば動くんじゃね
パーティション関数とかつかえるなら違う書き方もできるけど
>>978はtypo別にしてもいろいろ残念
0981NAME IS NULL2018/01/02(火) 10:42:11.51ID:???
>>980
サブクエリにorder by使えないと思う
オラクルは使えるみたいだけど
0982NAME IS NULL2018/01/02(火) 11:12:27.53ID:???
>>981
すいませんtop があればサブクエリでorderby 使える事知らなかった
0983NAME IS NULL2018/01/02(火) 11:16:49.66ID:???
>>981
> サブクエリにorder by使えないと思う
SQL-Server 2005以降ならtopを指定してたら使える
0984NAME IS NULL2018/01/02(火) 11:29:49.96ID:???
出来れば ostgres をベースに回答してやろうよ
09859712018/01/02(火) 15:04:26.15ID:???
みなさまありがとうございます
相関サブクエリ?で値でソートしたあとの最初のレコードを取ってくれば良いんですね
チャレンジしてみます
0986NAME IS NULL2018/01/02(火) 16:06:45.83ID:???
>出来れば ostgres をベースに回答してやろうよ

Postgres ?
なんでPostgresなのかね

テンプレに
【質問テンプレ】
・DBMS名とバージョン
ってあるのにそれを書かない質問者の不手際だろ
0988NAME IS NULL2018/01/02(火) 16:11:42.06ID:???
>>986
971にpostgresって書いてあるけど、 オストグレスは知らんが
0989NAME IS NULL2018/01/02(火) 16:13:16.36ID:???
テンプレ通りではないが、
>>971の最後の行に
>Postgres使ってます
こうあるので
0990NAME IS NULL2018/01/02(火) 16:14:09.12ID:???
Symfowareでよろ
0991NAME IS NULL2018/01/03(水) 10:35:26.64ID:X70UaZKX
>>980 みたいなのを真に受けるなよ
0992NAME IS NULL2018/01/03(水) 22:50:26.68ID:???
具体的な問題点を指摘できんなら黙っとけや
0993NAME IS NULL2018/01/04(木) 12:53:23.31ID:49+pCNSV
>>992
select
from (select
group by
having count(*) > 1)
where
0994NAME IS NULL2018/01/04(木) 15:47:10.27ID:???
>>993
何が言いたいのかわからない
>>980はすくなくともSQL Serverなら正しく動いた
DBMSによってはサブクエリのorder byとtop(limit)が効かないかもしれんが
ポスグレがそうならそう指摘して正しく動くSQL示せば良い話
0995NAME IS NULL2018/01/04(木) 16:07:09.61ID:49+pCNSV
なんでそんなクソSQLをごり押ししたいのか?
0996NAME IS NULL2018/01/04(木) 18:43:28.68ID:F4EONRA7
>>992
select
from (select id, min(日付)
from テーブル
group by id
having count(*) > 1)
where
0997NAME IS NULL2018/01/04(木) 19:01:47.94ID:???
お前要件取り違えてるだろ
0998NAME IS NULL2018/01/04(木) 20:10:33.27ID:F4EONRA7
日付から考えるからおかしくなる。

これがプログラムならそういう順序では考えない。

質問者の「ソート」という言葉に惑わされてるんだろうな。
0999NAME IS NULL2018/01/04(木) 20:16:13.07ID:F4EONRA7
正確にはIDでグループ化した日付のMAXと、IDでグループ化したcountの結果の比較だけど、初めから答え書く気はない。
10011001Over 1000Thread
このスレッドは1000を超えました。
新しいスレッドを立ててください。
life time: 542日 22時間 52分 44秒
10021002Over 1000Thread
5ちゃんねるの運営はプレミアム会員の皆さまに支えられています。
運営にご協力お願いいたします。


───────────────────
《プレミアム会員の主な特典》
★ 5ちゃんねる専用ブラウザからの広告除去
★ 5ちゃんねるの過去ログを取得
★ 書き込み規制の緩和
───────────────────

会員登録には個人情報は一切必要ありません。
月300円から匿名でご購入いただけます。

▼ プレミアム会員登録はこちら ▼
https://premium.5ch.net/

▼ 浪人ログインはこちら ▼
https://login.5ch.net/login.php
レス数が1000を超えています。これ以上書き込みはできません。

ニューススポーツなんでも実況