У меня есть таблица MySQL, где есть много строк для каждого человека, и я хочу написать запрос, который объединяет строки со специальным ограничением. (один на человека)Как написать запрос, который объединяет одну строку с последней датой среди нескольких строк?
Например, скажем, таблица состоит из следующих данных.
name date reason
---------------------------------------
John 2013-04-01 14:00:00 Vacation
John 2013-03-31 18:00:00 Sick
Ted 2012-05-06 20:00:00 Sick
Ted 2012-02-20 01:00:00 Vacation
John 2011-12-21 00:00:00 Sick
Bob 2011-04-02 20:00:00 Sick
Я хочу видеть распределение столбца «причина». Если я просто напишу запрос, например, ниже
select reason, count(*) as count from table group by reason
затем я смогу увидеть множество причин для этой таблицы в целом.
reason count
------------------
Sick 4
Vacation 2
Однако меня интересует только одна причина от каждого человека. Причина, которая должна быть засчитана, должна быть из строки с последней датой из записей человека. Например, самая последняя причина Джона - Vacation
, а последняя причина Теда - Sick
. И последняя причина Боба (и единственная причина) - Sick
.
Ожидаемый результат для этого запроса должен быть следующим. (Сумма графа будет 3, потому что есть только 3 человека)
reason count
-----------------
Sick 2
Vacation 1
Можно ли написать запрос такой, что однократное последняя причина будет учитываться, когда я хочу, чтобы увидеть распределение (счет) причин?
Вот некоторые факты о таблице.
- Таблица содержит десятки миллионов строк
- Для большинства раз, каждый человек имеет одну причину.
- Некоторые люди имеют несколько причин, но 99,99% людей имеют менее 5 причин.
- Существует около 30 различных причин, в то время как есть миллионы различных имен.
- Таблица разделена на основе диапазона дат.
Я вижу различные SQL-решения, предлагаемые людьми. Спасибо за ответы. Но я не уверен, какой из них будет идеальным, поскольку таблица имеет миллионы строк. Будет ли использовать запрос «объяснять», чтобы рассказать мне лучший запрос? Или кто-нибудь знает, какой из ответов является лучшим, просто глядя на него? – user482594
Запрос - все очень похожее и даст вам столько же времени. Попробуйте, план объяснений никогда не скажет вам, достаточно ли это! –