Очень сложная группа по / уникально / лимит от SQL-Command

StackOverflow https://stackoverflow.com/questions/3998036

  •  10-10-2019
  •  | 
  •  

Вопрос

Я на самом деле даже не знаю, как называть это: 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-Command мне нужно, что приведет к:

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

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

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

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

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

Это было полезно?

Решение

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

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

Вы можете использовать пол или потолок вместо круглого, в зависимости от того, что вы хотите.

Другие советы

Стандартный SQL не очень хорошо справляется с интервалами. Вам нужно будет сделать самостоятельный устройство стола, чтобы сравнить даты разных кортежей. Таким образом, вы можете легко найти все пары кортежей, из которых даты не более 500 друг от друга. Тем не менее, вы действительно хотите объединить даты в наборах не более 500 друг от друга, и это вообще не может быть выражено в SQL вообще, насколько я знаю.

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

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

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» делал пост.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top