Я использую Stack Exchange Data Explorer для изучения SQL, но я думаю, что основы этого вопроса применимы к другим базам данных.
Я пытаюсь запросить таблицу Badges
, которая согласно Stexdex (это то, что я буду называть ее теперь) имеет следующую схему:
Это хорошо работает для значков, таких как [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 года 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 // :
Но ответы на этот вопрос с отдельной колонкой для серебра и золота также велики, так что не стесняйтесь придерживаться этого угла. Мне все еще любопытно, как бы вы сделали вышеупомянутое.