2013-09-30 5 views
3

Предположим, что существует 25 групп программистов, с 5-100 программистов в каждой группе. Каждой группе программистов поручено написать запрос, на который ссылается этот вопрос. В ответ на эту задачу многие программисты в каждой группе начинают пить сильно. Каждая группа имеет укомплектованный бар, состоящий из:Получить максимальное количество последовательных повторяющихся записей в MySQL

  • Виски
  • Водка
  • Пиво
  • воды

Каждый раз, когда программист заканчивает пить, новая строка добавляется в таблицу в том числе:

  • Время, когда напиток был закончен
  • Group ID
  • Программист ID
  • Типа напитка потребляется

Руководитель программы хочет получать по электронной почте каждые шесть часов со списком программистов, которые потребляли 5 или более Бирса в ряде, в пределах последние 6 часов, без выстрела водки/виски или стакана воды. Общее количество пива, которое потреблял каждый программист, не переходя на другой напиток хотя бы один раз, должно быть включено в отчет.

Если по крайней мере один напиток, кроме пива потребляется до достижения 5 сортов пива, то, что программист не будет идти в списке.

Там нет верхней или нижней границы на количество напитков, которые программист может потреблять в 6-часовой период.

Там нет никаких требований по типу или заказ напитков, что любой программист может потреблять.

База данных MySQL имеет таблицу 'напитков' с:

  • drinks_id INT (11) PK Н. И.
  • group_id INT (11) NN
  • programmer_id INT (11) NN
  • type_of_drink УАКСНАК (25) Н.Н.
  • time_finished DATETIME NN

(тип напиток, вероятно, должен быть в другом столе, а drink_type_id используется, но я собираюсь для простоты здесь)

Ядро того, что я ищу, - это максимальное значение счета числа последовательных строк с помощью type_of_drink = 'beer 'для каждой комбинации групп/программистов в течение определенного периода времени. Я исчерпал свои навыки SQL пытаюсь подсчитать количество последовательных записей, которые существуют между двумя записями с type_of_drink <> «пивом» и возвращая максимальное значение для каждой комбинации группы/программатор. Я не могу понять, что это правильно, и, возможно, это не так, чтобы взглянуть на эту проблему.

Заранее спасибо. Я буду рад предоставить любую дополнительную информацию или требования, если это необходимо.

+0

Вы пробовали функцию оконной обработки? Вы можете сгруппировать программистом и выпить и вернуть счет (*) и повредить настройками, чтобы перезапустить счет каждый раз, когда вы нажмете новый напиток. Взгляните на http://technet.microsoft.com/en-us/library/ms189461.aspx, документы действительно детализированы, но, надеюсь, укажут вам в правильном направлении. Если вам нужна дополнительная помощь, попробуйте добавить образцы данных в sql скрипт и дать нам ожидаемый результат для работы. – Vulcronos

+0

@ Vulcronos MySql не имеет встроенных функций ... [но их можно эмулировать с использованием пользовательских переменных] (http://explainextended.com/2009/03/10/analytic-functions-first_value-last_value-lead- отставание /). –

+0

@MichaelFredrickson Спасибо за информацию. Я считаю, что функции Windowing настолько полезны, что я часто ненавижу использовать платформу, которая их не имеет. Я знаю, что вы также можете использовать группу, чтобы получить агрегированные значения, а затем присоединиться к исходной таблице, чтобы получить нужные вам данные. – Vulcronos

ответ

3
SELECT DISTINCT programmer_id 
FROM (
    SELECT 
    programmer_id, 
    @beercounter := IF(@prev_programmer != programmer_id OR type_of_drink != 'beer', 1, @beercounter + 1) AS how_many_beer_in_a_row, 
    @prev_programmer := programmer_id 
    FROM 
    your_table y 
    , (SELECT @beercounter:=1, @prev_programmer:=NULL) vars 
    WHERE time_finished >= NOW() - INTERVAL 6 HOUR 
    ORDER BY programmer_id, time_finished 
) sq 
WHERE how_many_beer_in_a_row >= 5 
+0

Это трюк. Нужно было немного изменить его для работы с фактическими данными, но это всегда так. Большое спасибо! – user2832688

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