Очень сложная группировка по / уникальному / лимит по SQL-команде - PullRequest
0 голосов
/ 22 октября 2010

Я даже не знаю, как это назвать: P, но ...

У меня есть одна таблица, назовем ее «загрузки»

id    owner    date
-----------------------------
0     foo      20100101120000
1     bar      20100101120300
2     foo      20100101120400
3     bar      20100101120600
..    ..       ..
6     foo      20100101120800

Теперь, когда я сделаю что-то вроде:

SELECT id FROM uploads ORDER BY date DESC

Это приведет к:

id    owner    date
-----------------------------
6     foo      20100101120800
..    ..       ..
3     bar      20100101120600
2     foo      20100101120400
1     bar      20100101120300
0     foo      20100101120000

Вопрос: Хорошо, но я хочу пойти еще дальше. Потому что теперь, когда вы строите временную шкалу (а я это сделал: P), вас «спамят» сообщения о том, что foo и bar что-то загрузили. Я хотел бы сгруппировать их и вернуть первый результат с ограничением по времени в поле даты «500».

Какая SQL-команда мне нужна, что приведет к:

id    owner    date
-----------------------------
6     foo      20100101120800
3     bar      20100101120600
0     foo      20100101120000

Затем, после этого, я могу выполнить вызов для каждой записи, чтобы получить ассоциативные записи в течение 5 минут (это пример для id = 6):

SELECT id FROM uploads WHERE date>=20100101120800-500 ORDER BY date DESC

Кто-нибудь сейчас знает, как мне сделать первый шаг? (ограничивая / группируя результаты)

(кстати. Я знаю, что когда я хочу использовать это, я должен конвертировать каждую дату (YmdHis = 60) в Unix-время (= 100), но мне не нужны 5 минут чтобы быть ровно 5 минут, иногда они могут быть на минуту меньше ...)

Ответы [ 3 ]

1 голос
/ 22 октября 2010

Использовать встроенный вид?например, что-то вроде

SELECT u1.* 
FROM uploads u1,
(SELECT date 
    FROM uploads u2
    WHERE u2.owner='foo') datum_points
WHERE u1.date BETWEEN datum_points.date
    AND DATE_ADD(datum_points.date INTERVAL 5 MINUTES)

должно вернуть все сообщения, сделанные в течение 5 минут после 'foo' создания сообщения.

1 голос
/ 22 октября 2010

Мне не совсем ясно, какой результат вы пытаетесь получить, даже с вашими примерами.Возможно что-то с округлением и группировкой по.

SELECT max(id) max_id,owner, (ROUND(date/500)*500) date_interval, max(date) date
FROM uploads GROUP BY date_interval,owner

Вы можете использовать FLOOR или CEILING вместо ROUND, в зависимости от того, что вы хотите.

1 голос
/ 22 октября 2010

Стандартный SQL не очень хорошо справляется с интервалами.Вам нужно будет самостоятельно объединить таблицу, чтобы сравнить даты разных кортежей.Таким образом, вы можете легко найти все пары кортежей, даты которых не более 500 друг от друга.Тем не менее, вы действительно хотите кластеризовать даты в наборах с интервалом не более 500 - и это, насколько я знаю, никак не может быть выражено в SQL.разбить общий временной интервал на фиксированные диапазоны по 500 единиц, а затем кластеризовать все кортежи в таблице на основе интервала, в котором они находятся. Для этого вам сначала потребуется таблица или результат запроса с временем начала интервалов;это можно создать с помощью SQL-запроса к вашей таблице и функции, которая либо «округляет» временную метку до времени начала своего интервала, либо вычисляет его порядковый номер интервала.Затем в качестве второго шага вы можете объединить таблицу с этим результатом, чтобы сгруппировать ее временные метки в соответствии с их соответствующим временем начала.Я не могу дать SQL, потому что он зависит от СУБД, и я, конечно, не могу сказать вам, является ли это наилучшим способом достижения того, чего вы хотите в вашей ситуации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...