SQL質疑応答スレ 17問目 [無断転載禁止]©2ch.net
レス数が1000を超えています。これ以上書き込みはできません。
このスレは
「こういうことをやりたいんだけどSQLでどう書くの?」
「こういうSQLを書いたんだけどうまく動きません><」
などの質問を受け付けるスレです。
SQLという言語はISOによって標準化されていますが
この標準を100%実装したDBMSは存在せず、
また、DBMSによっては標準でない独自の構文が
追加されていることもあります。
質問するときはDBMS名を必ず付記してください。
【質問テンプレ】
・DBMS名とバージョン
・テーブルデータ
・欲しい結果
・説明
前スレ:
SQL質疑応答スレ 16問目
http://echo.2ch.net/test/read.cgi/db/1447160858/ >>950
シリアライズしたテキストなんて曖昧なデータぶっこむのもOKだけど
RDB使ってんなら関係性重視したいよねっていう >>952
お前がやりたいなら止めはしないけどお前が重視したいらしい関係性て
おそらく関係モデルの関係とはなんも関係ない関係性やでw RDBじゃないDBMSの選択肢が極端に少ないって実情があるからな >おそらく関係モデルの関係とはなんも関係ない関係性やでw
それはない
正規化から勉強しなおしだな >>955
いやあるからわざわざ言っとんのやでw
意固地のベイビーちゃんやなw >>955
要件もはっきりしてないのに
> それはない
って言い切る奴はバカ認定してもいいかな? 奇をてらわずに>>943でいいじゃんな
スループット確保したいとか入力値が無法地帯でモデリングしようがないとか
そういう時に初めて検討すりゃいい KVS
ID 1
VALUE {
"name": "山田太郎",
"age": "35",
"addr": "東京都",
"attr": [
]
}
これじゃRDBの意味がない KVS
ID: 1
VALUE: "山田太郎"
ID: 2
VALUE: "35"
ID: 3
VALUE: "東京都"
にすると扱うのが却って難しい >>960
えっ?
どこがブーメランなんだい?
ちょっと説明してみ MariaDB(MySQL)で質問です
Userテーブルがあり、各ユーザーはpointというint型のフィールドがあります
このpointの合計がx以上になる分だけのユーザーをソートして取得したいと考えています
色々と調べたり試行錯誤してみましたが限界を感じましたので
どうか皆様の知恵をおかしください。よろしくお願いします pointの合計ってなに?なんか計算をしたいの?
・Userテーブルがある
・各ユーザーはpointというフィールドを持つ
ちゃんとテーブルの構成を書かないとこれだけじゃよくわからない ユーザーIDでgroup by し sumでpointを集計
order by ユーザーID
んでhavingで sum(point) > x
みたいな? 誰でも簡単にパソコン1台で稼げる方法など
参考までに、
⇒ 『宮本のゴウリエセレレ』 というブログで見ることができるらしいです。
グーグル検索⇒『宮本のゴウリエセレレ』
J7FO55UASR >>968
でも、君あちこちにコピペしてて苦労してそうじゃん
もっと簡単に稼げるぞ where 句のIN演算子の書き方ってモヤっとしない? 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使ってます >>971
>前回の日付から遡って1年間の間
頭悪くて済まないが、この意味がよく分からない >>972
言葉足らずでごめん
日付でソートした際の1つ前のレコードから遡って1年間
A | 16-01-01 | 10
A | 16-11-01 | 20
これだと、1行目はこの前の時点のデータがないからNULLで、
2行目のは1つ前のレコードである16-01-01から遡って1年間を集計期間にしたい いきなり最終形にしようとするからわからないんだろうな。 少しずつ実現するのが近道部品を組み立てる組み立てるつもりで考えてみよう SQLポンコツなんだ…
せめてヒントをくれるとありがたいです ID列でグループ化、日付列がcountで2レコード以上のレコードを取得して、日付が最小のレコードを取得する。
あなたのためにあえてSQLは書かない。 >>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 >>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別にしてもいろいろ残念 >>980
サブクエリにorder by使えないと思う
オラクルは使えるみたいだけど >>981
すいませんtop があればサブクエリでorderby 使える事知らなかった >>981
> サブクエリにorder by使えないと思う
SQL-Server 2005以降ならtopを指定してたら使える 出来れば ostgres をベースに回答してやろうよ みなさまありがとうございます
相関サブクエリ?で値でソートしたあとの最初のレコードを取ってくれば良いんですね
チャレンジしてみます >出来れば ostgres をベースに回答してやろうよ
Postgres ?
なんでPostgresなのかね
テンプレに
【質問テンプレ】
・DBMS名とバージョン
ってあるのにそれを書かない質問者の不手際だろ >>986
971にpostgresって書いてあるけど、 オストグレスは知らんが テンプレ通りではないが、
>>971の最後の行に
>Postgres使ってます
こうあるので >>992
select
from (select
group by
having count(*) > 1)
where >>993
何が言いたいのかわからない
>>980はすくなくともSQL Serverなら正しく動いた
DBMSによってはサブクエリのorder byとtop(limit)が効かないかもしれんが
ポスグレがそうならそう指摘して正しく動くSQL示せば良い話 >>992
select
from (select id, min(日付)
from テーブル
group by id
having count(*) > 1)
where 日付から考えるからおかしくなる。
これがプログラムならそういう順序では考えない。
質問者の「ソート」という言葉に惑わされてるんだろうな。 正確にはIDでグループ化した日付のMAXと、IDでグループ化したcountの結果の比較だけど、初めから答え書く気はない。 このスレッドは1000を超えました。
新しいスレッドを立ててください。
life time: 542日 22時間 52分 44秒 5ちゃんねるの運営はプレミアム会員の皆さまに支えられています。
運営にご協力お願いいたします。
───────────────────
《プレミアム会員の主な特典》
★ 5ちゃんねる専用ブラウザからの広告除去
★ 5ちゃんねるの過去ログを取得
★ 書き込み規制の緩和
───────────────────
会員登録には個人情報は一切必要ありません。
月300円から匿名でご購入いただけます。
▼ プレミアム会員登録はこちら ▼
https://premium.5ch.net/
▼ 浪人ログインはこちら ▼
https://login.5ch.net/login.php レス数が1000を超えています。これ以上書き込みはできません。