Получение первого экземпляра даты из идентичных строк в SQL - PullRequest
0 голосов
/ 28 сентября 2018

У меня есть таблица, в которой есть несколько строк, которые практически идентичны, за исключением отметки времени.Будет много перестановок a, b и c, но мне нужна только самая ранняя из них отметка времени.

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

Ради конкретного примера ниже приведена упрощенная версия.Я просто собираюсь поставить год в поле метки времени для краткости в этом примере.

id | a | b | c | timestamp
1  | 1 | 2 | 1 | 2018
2  | 1 | 1 | 1 | 2016
3  | 1 | 1 | 1 | 2017
4  | 1 | 2 | 1 | 2010
5  | 1 | 2 | 3 | 2018

В этом примере мне нужно будет получить строки 2, 4 и 5.

Для справки, я использую MySQL и PHP.Я уже обработал большое количество записей программно, но у меня есть еще несколько десятков наборов записей.Несмотря на то, что у меня есть решение, где я загружаю их все, а затем перебираю, чтобы перехватить самую раннюю запись, мне бы очень хотелось узнать, возможно ли чисто SQL-решение.

Спасибо за тонну.

Ответы [ 2 ]

0 голосов
/ 28 сентября 2018

Вы можете использовать Group by с функцией Min () для отметки времени.

Попробуйте выполнить следующее:

SELECT t.a, t.b, t.c, MIN(t.timestamp) as timestamp 
FROM your_table AS t 
GROUP BY t.a, t.b, t.c
0 голосов
/ 28 сентября 2018

Простой способ - использовать предложение where и коррелированный подзапрос:

select t.*
from t
where t.timestamp = (select min(t2.timestamp)
                     from t t2
                     where t2.a = t.a and t2.b = t.b and t2.c = t.c
                    );

Для производительности вам нужен индекс на (a, b, c, timestamp).

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