我正在使用Stack Exchange Data Explorer来学习 SQL,但我认为该问题的基础知识适用于其他数据库。
我正在尝试查询该Badges
表,根据 Stexdex(这就是我从现在开始将其称为)具有以下架构:
- 徽章
- 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 月,只有 2 位用户获得了金奖[mysql]
:Quassnoi 和 Bill Karwin,证明了这一点在上面的结果中,他们的名字是唯一出现两次的名字。
所以这就是我理解它的方式:
- 第一次
Id
出现(按时间顺序)是银色徽章 - 第二次是为了金牌
现在,上述结果将白银和黄金条目混合在一起。我的问题是:
- 这是一个典型的设计,还是有更友好的模式/规范化/无论你怎么称呼它?
- 在当前的设计中,您将如何分别查询银色和金色徽章?
GROUP BY Id
并以某种方式选择最小/最大或第一/第二Date
?- 您如何编写一个先列出所有银徽章然后列出所有金徽章的查询?
- 还想象一下“真正的”查询可能更复杂,即不仅仅是按日期列出。
- 您将如何编写它以使其在银子查询和金子查询之间没有太多重复?
- 做两个完全独立的查询可能更典型吗?
- 这个成语叫什么?行“分区”查询以将它们放入“桶”或其他东西?
需求说明
最初我想要以下输出,本质上是:
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 // :
但是到目前为止,银和金的单独列的答案也很好,所以也可以随意追求这个角度。不过,我仍然很好奇你会怎么做。