SQL: нужна только 1 строка для каждой временной отметки - PullRequest
2 голосов
/ 27 июля 2010

У меня есть некоторый код SQL, который вставляет значения из другой (не основанной на SQL) системы. одно из значений, которые я получаю, это метка времени.

я могу получить несколько вставок с одинаковой отметкой времени (хотя и другими значениями для других полей).

Моя проблема в том, что я пытаюсь, чтобы первая вставка происходила каждый день (на основе метки времени), начиная с определенного дня (то есть, дайте мне первую вставку каждого дня с 28 января 2007 года ...)

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

SELECT MIN(my_timestamp) AS first_timestamp
FROM my_schema.my_table
WHERE my_col1 = 'WHATEVER'
AND my_timestamp > timestamp '2010-Jul-27 07:45:24' - INTERVAL '365 DAY'
GROUP BY DATE (my_timestamp);

Это дает мне список доступных времен. Но когда я присоединяюсь к этим временам, я могу получить несколько строк, так как в этот раз есть много строк. Таким образом, за 365 дней я могу получить 5000 строк (я могу вставлять 100 строк в 00:00:00 каждый день).

Предполагая, что в приведенном выше примере my_table содержит столбцы my_col1 и my_col2, как я могу получить ровно 365 строк, содержащих my_col1 & my_col2? не имеет значения, к какой строке я вернусь, если на дату есть несколько строк; любой строки будет достаточно.

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

спасибо за помощь заранее.

EDIT: Итак, скажем, например, эта таблица имеет следующие столбцы: my_col1, my_col2 и my_timestamp.
Вот примеры значений (в порядке my_col1 - my_col2 - my_timestamp):

  • 'my_val1' - 10 - '2010-07-01 01: 01: 01'
  • 'my_val2' - 11 - '2010-07-01 01: 01: 01'
  • 'my_val3' - 12 - '2010-07-01 01: 01: 01'
  • 'my_val4' - 13 - '2010-07-01 01: 01: 02'
  • 'my_val5' - 14 - '2010-07-02 01: 01: 01'
  • 'my_val6' - 15 - '2010-07-02 01: 01: 01'
  • 'my_val7' - 16 - '2010-07-03 01:01:01'

в конце я хотел бы только 3 строки, 1 с отметкой времени с '2010-07-01 01:01:01', одна с '2010-07-02 01:01:01' и одна с '2010-07-03 01:01:01'. третий - простой, поскольку с последней отметкой времени есть только 1 строка. но первые два хитрые. sql, который я разместил выше, будет игнорировать строку с 'my_val4'.

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

как мне получить sql, чтобы дать мне либо первое, либо последнее из значений, которые будут соответствовать этой отметке времени (это не имеет значения в любом случае. Мне просто нужно получить совпадение с отметкой времени 1-го первого дня)?

Ответы [ 3 ]

4 голосов
/ 27 июля 2010
select distinct on (date(my_timestamp)) *
from my_table
order by date(my_timestamp), my_timestamp

Выбирает все столбцы, ровно по одной строке на date(my_timestamp).Одна строка в день - это первая строка для группы, определяемая как order by (то есть строка с минимальным значением my_timestamp).

Конечно, вы можете добавить что угодно joins, wheresи т.д. вам нужно.Но это заглушка, которую вы ищете.

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

Решение состоит в том, чтобы использовать оператор SQL DISTINCT (http://www.sql -tutorial.com / sql-diver-sql-tutorial / ):

SELECT DISTINCT MIN(my_timestamp) AS first_timestamp FROM my_schema.my_table WHERE my_col1 = 'WHATEVER' AND my_timestamp > timestamp '2010-Jul-27 07:45:24' - INTERVAL '365 DAY' GROUP BY DATE (my_timestamp);
0 голосов
/ 27 июля 2010

Я знаю, что у вас уже есть ответ, но я все еще не понимаю, почему вы упомянули объединение в своем вопросе. Почему бы просто не включить остальные столбцы в ваш запрос, например так:

SELECT MIN(my_timestamp) AS first_timestamp, my_col1, my_col2
FROM my_table
GROUP BY DATE(my_timestamp);

Это работает в MySQL. Не возвращает ли он ожидаемый результат в PostgreSQL?

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