SQL Group By question - выбор группы строк - PullRequest
1 голос
/ 21 июля 2010

У меня есть таблица, в которой отслеживаются серийные номера и количество лицензий, связанных с указанным серийным номером.Клиент может повторно лицензировать ящик, увеличивая или уменьшая количество пользователей, и им выставляется счет только за измененную сумму.

Существует следующая структура таблицы:

id - Auto Incrementing ID
serial - The serial number
numusers - the number of licenses
date - The date that the request was submitted, with the highest date being the number of users currently licensed

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

SELECT p.id as id, c.id as oldid, p.numusers-c.numusers AS dif, p.date, c.date
FROM `licenses` AS p 
JOIN `licenses` AS c ON p.serial = c.serial 
                    AND p.date > c.date 
                    AND p.id <> c.id
WHERE p.id = 156
#GROUP BY p.id

Вот набор данных:

id  serial  numusers    date
26  1234    500         2010-07-14
34  1234    600         2010-07-15
156 1234    500         2010-07-21

Когда я запускаюзапрос, я получаю следующее:

id      oldid       dif         date          date
156     26          0          2010-07-21    2010-07-14
156     34          -100       2010-07-21    2010-07-15

Если я раскомментирую предложение GROUP BY в запросе, я получу строку со значением oldid, равным 26. Как выбрать только строку с самой последней датой (ряд с oldid 34)?Я мог бы использовать ORDER BY и LIMIT 1, но я также хочу иметь возможность выбирать из всей таблицы без предложения WHERE.

Я использую MySQL 5.1.

Ответы [ 2 ]

1 голос
/ 21 июля 2010

Может быть, вам нужно:

select p.id, c.id as priorid, p.numusers-c.numusers AS dif, p.date, c.date as priordate    
from licenses p
join licenses c on c.serial=p.serial
  and c.date=(select max(date) from licenses ref where ref.serial=p.serial
    and ref.date<p.date)
order by p.serial

Я всегда находил довольно раздражающим ограничением SQL, которое говорит: «достань мне поле X из записи с максимальным значением поля Y»Мне нужно прочитать таблицу один раз, чтобы найти максимальное значение Y со встроенным запросом, а затем снова прочитать ее, чтобы заново найти запись с этим значением и получить другие значения, которые мне нужны.

Если естьтри записи для одного и того же серийного номера, приведенные выше должны дать две «разностные» строки на выходе.Я думаю, что вы говорите, что хотите.Если для данного Serial существует только одна запись, вышеприведенное не даст вывода для этого Serial, что может быть тем, что вы хотите, а может и нет.

1 голос
/ 21 июля 2010

Будет ли производная таблица полезной;что-то вроде ...

SELECT *
    FROM (SELECT p.id as id,
                 c.id as oldid,
                 p.numusers-c.numusers AS dif,
                 p.date,
                 c.date
              FROM `licenses` AS p JOIN `licenses` AS c ON p.serial = c.serial 
                   AND p.date > c.date 
                   AND p.id <> c.id
              ORDER BY oldid DESC) AS inner_table
    GROUP BY id;
...