■ このスレッドは過去ログ倉庫に格納されています
SQL質疑応答スレ 17問目
- 1 :NAME IS NULL:2016/07/10(日) 22:29:01.40 ID:???.net
- このスレは
「こういうことをやりたいんだけどSQLでどう書くの?」
「こういうSQLを書いたんだけどうまく動きません><」
などの質問を受け付けるスレです。
SQLという言語はISOによって標準化されていますが
この標準を100%実装したDBMSは存在せず、
また、DBMSによっては標準でない独自の構文が
追加されていることもあります。
質問するときはDBMS名を必ず付記してください。
【質問テンプレ】
・DBMS名とバージョン
・テーブルデータ
・欲しい結果
・説明
前スレ:
SQL質疑応答スレ 16問目
http://echo.2ch.net/test/read.cgi/db/1447160858/
- 952 :NAME IS NULL:2017/12/14(木) 10:43:19.73 ID:???.net
- >>950
シリアライズしたテキストなんて曖昧なデータぶっこむのもOKだけど
RDB使ってんなら関係性重視したいよねっていう
- 953 :NAME IS NULL:2017/12/14(木) 18:55:46.58 ID:W31f7YBM.net
- >>952
お前がやりたいなら止めはしないけどお前が重視したいらしい関係性て
おそらく関係モデルの関係とはなんも関係ない関係性やでw
- 954 :NAME IS NULL:2017/12/15(金) 01:27:41.00 ID:???.net
- RDBじゃないDBMSの選択肢が極端に少ないって実情があるからな
- 955 :NAME IS NULL:2017/12/15(金) 02:37:31.20 ID:???.net
- >おそらく関係モデルの関係とはなんも関係ない関係性やでw
それはない
正規化から勉強しなおしだな
- 956 :NAME IS NULL:2017/12/15(金) 07:47:26.78 ID:6QrkU8mN.net
- >>955
いやあるからわざわざ言っとんのやでw
意固地のベイビーちゃんやなw
- 957 :NAME IS NULL:2017/12/15(金) 12:49:28.67 ID:???.net
- >>955
要件もはっきりしてないのに
> それはない
って言い切る奴はバカ認定してもいいかな?
- 958 :NAME IS NULL:2017/12/15(金) 15:11:25.84 ID:???.net
- しょせん他人事でどうでもいいことに熱くなるなよ
- 959 :NAME IS NULL:2017/12/15(金) 16:58:53.39 ID:???.net
- 奇をてらわずに>>943でいいじゃんな
スループット確保したいとか入力値が無法地帯でモデリングしようがないとか
そういう時に初めて検討すりゃいい
- 960 :NAME IS NULL:2017/12/15(金) 17:09:24.86 ID:???.net
- >>957
それブーメラン
- 961 :NAME IS NULL:2017/12/15(金) 17:18:42.86 ID:???.net
- KVS
ID 1
VALUE {
"name": "山田太郎",
"age": "35",
"addr": "東京都",
"attr": [
]
}
これじゃRDBの意味がない
- 962 :NAME IS NULL:2017/12/15(金) 17:21:46.72 ID:???.net
- KVS
ID: 1
VALUE: "山田太郎"
ID: 2
VALUE: "35"
ID: 3
VALUE: "東京都"
にすると扱うのが却って難しい
- 963 :NAME IS NULL:2017/12/15(金) 21:41:32.93 ID:???.net
- >>960
えっ?
どこがブーメランなんだい?
ちょっと説明してみ
- 964 :NAME IS NULL:2017/12/25(月) 08:23:47.10 ID:Xetk2Fg1.net
- MariaDB(MySQL)で質問です
Userテーブルがあり、各ユーザーはpointというint型のフィールドがあります
このpointの合計がx以上になる分だけのユーザーをソートして取得したいと考えています
色々と調べたり試行錯誤してみましたが限界を感じましたので
どうか皆様の知恵をおかしください。よろしくお願いします
- 965 :NAME IS NULL:2017/12/25(月) 11:11:43.13 ID:???.net
- pointの合計ってなに?なんか計算をしたいの?
・Userテーブルがある
・各ユーザーはpointというフィールドを持つ
ちゃんとテーブルの構成を書かないとこれだけじゃよくわからない
- 966 :NAME IS NULL:2017/12/25(月) 16:20:46.40 ID:???.net
- ユーザーIDでgroup by し sumでpointを集計
order by ユーザーID
んでhavingで sum(point) > x
みたいな?
- 967 :NAME IS NULL:2017/12/25(月) 17:50:53.80 ID:Xetk2Fg1.net
- >>966
試してみます!
- 968 :NAME IS NULL:2017/12/29(金) 11:02:39.55 ID:dtNZwIie.net
- 誰でも簡単にパソコン1台で稼げる方法など
参考までに、
⇒ 『宮本のゴウリエセレレ』 というブログで見ることができるらしいです。
グーグル検索⇒『宮本のゴウリエセレレ』
J7FO55UASR
- 969 :NAME IS NULL:2017/12/29(金) 17:11:12.15 ID:???.net
- >>968
でも、君あちこちにコピペしてて苦労してそうじゃん
もっと簡単に稼げるぞ
- 970 :NAME IS NULL:2017/12/31(日) 07:10:08.80 ID:???.net
- where 句のIN演算子の書き方ってモヤっとしない?
- 971 :NAME IS NULL:2018/01/01(月) 15:34:27.49 ID:???.net
- 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使ってます
- 972 :NAME IS NULL:2018/01/01(月) 15:57:02.83 ID:???.net
- >>971
>前回の日付から遡って1年間の間
頭悪くて済まないが、この意味がよく分からない
- 973 :NAME IS NULL:2018/01/01(月) 16:20:06.66 ID:???.net
- >>972
言葉足らずでごめん
日付でソートした際の1つ前のレコードから遡って1年間
A | 16-01-01 | 10
A | 16-11-01 | 20
これだと、1行目はこの前の時点のデータがないからNULLで、
2行目のは1つ前のレコードである16-01-01から遡って1年間を集計期間にしたい
- 974 :NAME IS NULL:2018/01/01(月) 21:04:00.89 ID:iMl2Nb4o.net
- いきなり最終形にしようとするからわからないんだろうな。
- 975 :NAME IS NULL:2018/01/01(月) 21:30:53.28 ID:???.net
- 少しずつ実現するのが近道部品を組み立てる組み立てるつもりで考えてみよう
- 976 :971:2018/01/01(月) 22:29:55.07 ID:???.net
- SQLポンコツなんだ…
せめてヒントをくれるとありがたいです
- 977 :NAME IS NULL:2018/01/01(月) 22:36:14.85 ID:g9MeygUN.net
- ID列でグループ化、日付列がcountで2レコード以上のレコードを取得して、日付が最小のレコードを取得する。
あなたのためにあえてSQLは書かない。
- 978 :NAME IS NULL:2018/01/01(月) 23:05:35.41 ID:???.net
- >>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
- 979 :NAME IS NULL:2018/01/01(月) 23:08:58.34 ID:g9MeygUN.net
- ひどい例
- 980 :NAME IS NULL:2018/01/02(火) 02:01:15.52 ID:???.net
- >>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別にしてもいろいろ残念
- 981 :NAME IS NULL:2018/01/02(火) 10:42:11.51 ID:???.net
- >>980
サブクエリにorder by使えないと思う
オラクルは使えるみたいだけど
- 982 :NAME IS NULL:2018/01/02(火) 11:12:27.53 ID:???.net
- >>981
すいませんtop があればサブクエリでorderby 使える事知らなかった
- 983 :NAME IS NULL:2018/01/02(火) 11:16:49.66 ID:???.net
- >>981
> サブクエリにorder by使えないと思う
SQL-Server 2005以降ならtopを指定してたら使える
- 984 :NAME IS NULL:2018/01/02(火) 11:29:49.96 ID:???.net
- 出来れば ostgres をベースに回答してやろうよ
- 985 :971:2018/01/02(火) 15:04:26.15 ID:???.net
- みなさまありがとうございます
相関サブクエリ?で値でソートしたあとの最初のレコードを取ってくれば良いんですね
チャレンジしてみます
- 986 :NAME IS NULL:2018/01/02(火) 16:06:45.83 ID:???.net
- >出来れば ostgres をベースに回答してやろうよ
Postgres ?
なんでPostgresなのかね
テンプレに
【質問テンプレ】
・DBMS名とバージョン
ってあるのにそれを書かない質問者の不手際だろ
- 987 :NAME IS NULL:2018/01/02(火) 16:08:50.38 ID:???.net
- >>986
Postgres使ってます
- 988 :NAME IS NULL:2018/01/02(火) 16:11:42.06 ID:???.net
- >>986
971にpostgresって書いてあるけど、 オストグレスは知らんが
- 989 :NAME IS NULL:2018/01/02(火) 16:13:16.36 ID:???.net
- テンプレ通りではないが、
>>971の最後の行に
>Postgres使ってます
こうあるので
- 990 :NAME IS NULL:2018/01/02(火) 16:14:09.12 ID:???.net
- Symfowareでよろ
- 991 :NAME IS NULL:2018/01/03(水) 10:35:26.64 ID:X70UaZKX.net
- >>980 みたいなのを真に受けるなよ
- 992 :NAME IS NULL:2018/01/03(水) 22:50:26.68 ID:???.net
- 具体的な問題点を指摘できんなら黙っとけや
- 993 :NAME IS NULL:2018/01/04(木) 12:53:23.31 ID:49+pCNSV.net
- >>992
select
from (select
group by
having count(*) > 1)
where
- 994 :NAME IS NULL:2018/01/04(木) 15:47:10.27 ID:???.net
- >>993
何が言いたいのかわからない
>>980はすくなくともSQL Serverなら正しく動いた
DBMSによってはサブクエリのorder byとtop(limit)が効かないかもしれんが
ポスグレがそうならそう指摘して正しく動くSQL示せば良い話
- 995 :NAME IS NULL:2018/01/04(木) 16:07:09.61 ID:49+pCNSV.net
- なんでそんなクソSQLをごり押ししたいのか?
- 996 :NAME IS NULL:2018/01/04(木) 18:43:28.68 ID:F4EONRA7.net
- >>992
select
from (select id, min(日付)
from テーブル
group by id
having count(*) > 1)
where
- 997 :NAME IS NULL:2018/01/04(木) 19:01:47.94 ID:???.net
- お前要件取り違えてるだろ
- 998 :NAME IS NULL:2018/01/04(木) 20:10:33.27 ID:F4EONRA7.net
- 日付から考えるからおかしくなる。
これがプログラムならそういう順序では考えない。
質問者の「ソート」という言葉に惑わされてるんだろうな。
- 999 :NAME IS NULL:2018/01/04(木) 20:16:13.07 ID:F4EONRA7.net
- 正確にはIDでグループ化した日付のMAXと、IDでグループ化したcountの結果の比較だけど、初めから答え書く気はない。
- 1000 :NAME IS NULL:2018/01/04(木) 21:21:45.75 ID:???.net
- ume
- 1001 :2ch.net投稿限界:Over 1000 Thread
- 2ch.netからのレス数が1000に到達しました。
総レス数 1001
264 KB
掲示板に戻る
全部
前100
次100
最新50
read.cgi ver 2014.07.20.01.SC 2014/07/20 D ★