Stack Exchange Data Explorerを使用してSQLを学習していますが、質問の基本は他のデータベースにも当てはまると思います。
私はBadges
テーブルをクエリしようとしています。Stexdexによると(これからこれを呼び出します)、次のスキーマがあります。
- バッジ
- Id
- ユーザーID
- 名前
- 日にち
[Epic]
これは、のような一意の名前のバッジには適しています[Legendary]
が、シルバーとゴールドのタグ固有のバッジは、まったく同じ名前を持つことで混ざり合っているようです。
[mysql]
これが私がタグのために書いたクエリの例です:
SELECT
UserId as [User Link],
Date
FROM
Badges
Where
Name = 'mysql'
Order By
Date ASC
(わずかに注釈が付けられた)出力は次のとおりです。stexdexで見られるように:
User Link Date
--------------- ------------------- // all for silver except where noted
Bill Karwin 2009-02-20 11:00:25
Quassnoi 2009-06-01 10:00:16
Greg 2009-10-22 10:00:25
Quassnoi 2009-10-31 10:00:24 // for gold
Bill Karwin 2009-11-23 11:00:30 // for gold
cletus 2010-01-01 11:00:23
OMG Ponies 2010-01-03 11:00:48
Pascal MARTIN 2010-02-17 11:00:29
Mark Byers 2010-04-07 10:00:35
Daniel Vassallo 2010-05-14 10:00:38
これは、この記事の執筆時点でのシルバーとゴールドの獲得者の現在のリストと一致していますが、より時代を超越した言葉で言えば、2010年5月末現在、ゴールド[mysql]
タグを獲得しているのはQuassnoiとBillKarwinの2人だけです。上記の結果では、2回表示されるのは名前だけです。
だからこれは私がそれを理解する方法です:
- 初めて
Id
登場するのは(時系列で)シルバーバッジ用です - 二度目は金のためです
さて、上記の結果はシルバーとゴールドのエントリーを混ぜ合わせています。私の質問は次のとおりです。
- これは典型的な設計ですか、それとももっとフレンドリーなスキーマ/正規化/あなたがそれを呼んでいるものは何ですか?
- 現在のデザインでは、シルバーバッジとゴールドバッジを別々にクエリする方法を教えてください。
GROUP BY Id
Date
どういうわけかで最小/最大または最初/秒を選ぶ?- 最初にすべてのシルバーバッジをリストし、次にすべてのゴールドバッジをリストするクエリをどのように作成できますか?
- また、「実際の」クエリは、日付ごとにリストするだけでなく、より複雑になる可能性があることも想像してみてください。
- シルバーとゴールドのサブクエリの間で繰り返しが多すぎないように、どのように記述しますか?
- 代わりに、2つの完全に別個のクエリを実行する方がおそらくより一般的ですか?
- このイディオムは何と呼ばれていますか?それらを「バケット」か何かに入れるための行の「パーティション化」クエリ?
要件の明確化
もともと私は次の出力が欲しかったのですが、本質的には:
User Link Date
--------------- -------------------
Bill Karwin 2009-02-20 11:00:25 // result of query for silver
Quassnoi 2009-06-01 10:00:16 // :
Greg 2009-10-22 10:00:25 // :
cletus 2010-01-01 11:00:23 // :
OMG Ponies 2010-01-03 11:00:48 // :
Pascal MARTIN 2010-02-17 11:00:29 // :
Mark Byers 2010-04-07 10:00:35 // :
Daniel Vassallo 2010-05-14 10:00:38 // :
------- maybe some sort of row separator here? can SQL do this? -------
Quassnoi 2009-10-31 10:00:24 // result of query for gold
Bill Karwin 2009-11-23 11:00:30 // :
しかし、これまでのところ、シルバーとゴールドの列が分かれているという答えも素晴らしいので、その角度も自由に追求してください。しかし、私はあなたが上記をどのように行うのかまだ興味があります。