2012-02-08 2 views
2

Итак, каждое утро на работе у нас есть стенд-встреча. Мы бросаем ближайший объект в ручную по комнате, как метод решения, кто говорит в каком порядке. Будучи слегка странным, я решил, что было бы интересно получить некоторые данные об этих бросках. Поэтому каждое утро я запоминаю порядок бросков (а также другие важные вещи, например, кто сбросил мяч/странный губчатый объект, который, вероятно, тоже был мячом, и кто бросил кого-то, кто уже был или просто нанес ужасный бросок) и записывать эти данные в таблице:SQL Query - Группировка данных

+---------+-----+------------+----------+---------+----------+--------+--------------+ 
| throwid | day | date | thrownum | thrower | receiver | caught | correctthrow | 
+---------+-----+------------+----------+---------+----------+--------+--------------+ 
|  1 | 1 | 10/01/2012 |  1 | dan  | steve |  1 |   1 | 
|  2 | 1 | 10/01/2012 |  2 | steve | alice |  1 |   1 | 
|  3 | 1 | 10/01/2012 |  3 | alice | matt  |  1 |   1 | 
|  4 | 1 | 10/01/2012 |  4 | matt | justin |  1 |   1 | 
|  5 | 1 | 10/01/2012 |  5 | justin | arif  |  1 |   1 | 
|  6 | 1 | 10/01/2012 |  6 | arif | pete  |  1 |   1 | 
|  7 | 1 | 10/01/2012 |  7 | pete | greg  |  0 |   1 | 
|  8 | 1 | 10/01/2012 |  8 | greg | alan  |  1 |   1 | 
|  9 | 1 | 10/01/2012 |  9 | alan | david |  1 |   1 | 
|  10 | 1 | 10/01/2012 |  10 | david | dan  |  1 |   1 | 
|  11 | 2 | 11/01/2012 |  1 | dan  | david |  1 |   1 | 
|  12 | 2 | 11/01/2012 |  2 | david | alice |  1 |   1 | 
|  13 | 2 | 11/01/2012 |  3 | alice | steve |  1 |   1 | 
|  14 | 2 | 11/01/2012 |  4 | steve | arif  |  1 |   1 | 
|  15 | 2 | 11/01/2012 |  5 | arif | pete  |  0 |   1 | 
|  16 | 2 | 11/01/2012 |  6 | pete | justin |  1 |   1 | 
|  17 | 2 | 11/01/2012 |  7 | justin | alan  |  1 |   1 | 
|  18 | 2 | 11/01/2012 |  8 | alan | dan  |  1 |   1 | 
|  19 | 2 | 11/01/2012 |  9 | dan  | greg  |  1 |   1 | 
+---------+-----+------------+----------+---------+----------+--------+--------------+ 

Я теперь получил довольно много дней стоят данных для этого, и я начинаю запускать некоторые запросы на него для своих собственных целей (я имею не сказал остальной команде еще ... не хотел бы влиять на результаты). Я сделал несколько вопросов без каких-либо проблем, но я застрял, пытаясь получить определенный результат.

То, что я ищу, - это количество раз, когда каждый человек был последним членом команды, чтобы получить мяч. Теперь, как вы можете видеть на столе, из-за отсутствия и т. Д. Количество бросков в день не всегда постоянное, поэтому я не могу просто выбрать приемник по thrownum.

В случае для приведенных выше данных, было бы вернуть:

+--------+-------------------+ 
| person | LastReceiverTotal | 
+--------+-------------------+ 
| dan |     1 | 
| greg |     1 | 
+--------+-------------------+ 

Я получил это далеко:

SELECT MAX(thrownum) AS LastThrowNum, day FROM Throws GROUP BY day 

Теперь это возвращает некоторые полезные данные. Я получаю самый высокий уровень за каждый день. Казалось бы, все, что мне нужно сделать, это получить получателя за это значение, а затем получить граф, сгруппированный получателем, чтобы получить мой ответ. Однако это не работает, потому что результат не является тем, что кажется из-за вышеуказанного запроса с использованием агрегатных функций.

Я подозреваю, что существует гораздо лучший способ создания таблиц для хранения данных, чтобы быть честными, но в равной степени я также уверен, что есть способ получить эту информацию с таблицами, как они есть, - какой-то внутренний запрос? Я не могу понять, как это будет работать. Может ли кто-нибудь пролить свет на то, как это будет сделано?

+3

Серьезно: идите и выполняйте некоторые работы! ;-) –

+1

@JonEgerton Это гораздо более важно, чем любые мелкие вакансии, которые компания может иметь на данный момент ... * сводит к минимуму окно браузера * – Hecksa

+0

@Hecksa: Это MySQL? –

ответ

2

Запрос, который у вас есть, дает вам наибольшее количество за каждый день.

С этим вы просто выполняете внутреннее соединение со своим столом и получаете приемник и количество раз, которое он переживает.

select t.receiver as person, count(t.day) as LastReceiverTotal from Throws t 
inner join (SELECT MAX(thrownum) AS LastThrowNum, day FROM Throws GROUP BY day) a on a.LastThrowNum = t.thrownum and a.day = t.day 
group by t.receiver 
+0

Закрыть ... очень близко.Я предполагаю, что это будет хорошо работать в любой разумной базе данных, но поскольку я использую доступ, мне задают значение параметра для a.thrownum, когда я запускаю запрос. Кажется, что он работает корректно, но только для дней, которые имеют последний уровень, равный параметру, введенному вручную. Как бы то ни было, я * мог * справиться с этим с небольшими усилиями, но я разработчик, поэтому любое ручное усилие неприемлемо: P Я буду совать, чтобы узнать, могу ли я найти некоторую информацию о доступе SQL на обед, в то же время есть ли какая-то причина, по которой вы можете это увидеть? – Hecksa

+0

Да, теперь он должен работать. Это a.LastThrowNum, а не a.thrownum :) –

+1

ugh, разочарованный, я сам этого не выбрал. Отлично работает, спасибо. – Hecksa

Смежные вопросы