Как найти минимальную дату sql
Перейти к содержимому

Как найти минимальную дату sql

  • автор:

Как выбрать максимальную дату в sql

Чтобы выбрать максимальную дату в SQL, можно использовать функцию MAX() в сочетании с функцией даты для выбора максимального значения.

Вот пример использования функции MAX() для выбора максимальной даты из столбца date_column таблицы my_table :

SELECT MAX(date_column) AS max_date FROM my_table; 

Выбрать данные с минимальной датой из связанной таблицы в MySQL

где account_id — это внешний ключ на столбец id в таблице account . Мне нужно получить для каждого user_id одну запись из таблицы account , которая имеет связанную запись с наименьшей датой created_at в таблице deposit . Я пытался получить данные следующим запросом:

SELECT `account`.`id`, `account`.`user_id`, MIN(`deposit`.`created_at`) AS `date` FROM `account` INNER JOIN `deposit` ON `account`.`id` = `deposit`.`account_id` GROUP BY `account`.`user_id`; 

Что в итоге я получаю:

+----+---------+---------------------+ | id | user_id | date | +----+---------+---------------------+ | 1 | 2 | 2019-05-30 08:25:56 | | 2 | 12 | 2020-06-16 12:34:04 | | 3 | 13 | 2020-06-22 07:20:57 | +----+---------+---------------------+ 

Но в первой строке в столбце account.id я ожидаю получить «4«, т.к. именно этот счёт имеет связанную запись с наименьшей датой created_at . Подскажите, пожалуйста, как мне переделать мой запрос, чтобы получить правильный результат.
Заранее спасибо за помощь.

Отслеживать
Haku Kimura
задан 5 июл 2020 в 14:20
Haku Kimura Haku Kimura
1,762 2 2 золотых знака 8 8 серебряных знаков 13 13 бронзовых знаков
Какая версия MySQL?
5 июл 2020 в 16:58
@YitzhakKhabinsky 5.7.
6 июл 2020 в 4:41
как-то так dbfiddle.uk/…, но структура таблиц — ужас
6 июл 2020 в 6:24

@NovitskiyDenis спасибо, ваше решение работает. Оформите ваш sql-запрос, как ответ — я поставлю плюс и отмечу, как принятый. А по поводу структуры, многое делалось до меня, поэтому и приходится изощряться.

6 июл 2020 в 15:23

2 ответа 2

Сортировка: Сброс на вариант по умолчанию

Когда задаете вопрос, необходимо предоставить DDL и образец вставки данных.

Предполагая, что MySQL версии 8.0

-- DDL and sample data population, start CREATE TABLE account (id INT NOT NULL PRIMARY KEY, user_id INT); INSERT INTO account (id, user_id) VALUES (1, 2), (2,12), (3,13), (4, 2), (5, 2), (6, 2); CREATE TABLE deposit (id INT, account_id INT, created_at DATETIME, value DECIMAL(10,2) , INDEX (account_id), FOREIGN KEY (account_id) REFERENCES account (id)); INSERT INTO deposit (id, account_id, created_at, value) VALUES (1, 1,'2020-06-01 15:51:37',50.00), (2, 1,'2020-06-05 13:05:25',20.00), (3, 1,'2020-06-05 13:36:11',20.00), (4, 2,'2020-06-16 12:34:04',70.00), (5, 3,'2020-06-22 07:20:57',50.00), (6, 4,'2020-05-30 08:25:56',30.00); -- DDL and sample data population, end WITH rs AS ( SELECT a.*, b.created_at , ROW_NUMBER() OVER (PARTITION BY user_id ORDER BY b.created_at) AS seq FROM account a INNER JOIN deposit b ON a.id = b.account_id ) SELECT id, user_id, created_at FROM rs WHERE seq = 1; 
+----+---------+-------------------------+ | id | user_id | created_at | +----+---------+-------------------------+ | 4 | 2 | 2020-05-30 08:25:56.000 | | 2 | 12 | 2020-06-16 12:34:04.000 | | 3 | 13 | 2020-06-22 07:20:57.000 | +----+---------+-------------------------+ 
set @row_number := 0; set @user_id := 0; SELECT id, user_id, created_at FROM ( SELECT @row_number := CASE WHEN @user_id = user_id THEN @row_number + 1 ELSE 1 END AS seq, @user_id := user_id as user_id, id, created_at FROM (SELECT a.*, b.created_at FROM account AS a INNER JOIN deposit b ON a.id = b.account_id) as c ORDER BY user_id, created_at ASC) as z WHERE seq = 1; 

Как найти минимальную дату sql

Народ подскажите пожалуйста, как можно получить минимальную дату из выборке по регистру сведений.

Вот небольшой запрос.

|РаботыПоПроектуСрезПоследних.Статья КАК Статьи,
|МАКСИМУМ(РаботыПоПроектуСрезПоследних.ДатаОкончания) КАК ДатаНачала
|МИНИМУМ(РаботыПоПроектуСрезПоследних.ДатаНачала) КАК ДатаНачала
|
| ИЗ РегистрСведений.РаботыПоПроекту.СрезПоследних КАК
|РаботыПоПроектуСрезПоследних
|
| СГРУППИРОВАТЬ ПО
|РаботыПоПроектуСрезПоследних.Статья
|
|ИТОГИ
| МАКСИМУМ(ДатаОкончания),
| МИНИМУМ(ДатаНачала),
|ПО
| ОБЩИЕ,
| Статьи ИЕРАРХИЯ»

Проблема в том, что в для некоторых статей, ДатаНачала не указывается, и соответственно функции Минимум в выборку попадает значение 0, которое и является минимальным значением для группировки по иерархии. Т.о функция МИНИМУМ(РаботыПоПроектуСрезПоследних.ДатаНачала) в группировке по иерархии выдает 0.
Можно ли, как то отфильтровать нули и, заставить функцию МИНИМУМ работать для всех значений кроме нулевых.

.
|МИНИМУМ(
| ВЫБОР КОГДА РаботыПоПроектуСрезПоследних.ДатаНачала <> ДАТАВРЕМЯ(1,1,1)
| ТОГДА РаботыПоПроектуСрезПоследних.ДатаНачала
| ИНАЧЕ &ДатаСреза
| КОНЕЦ
| ) КАК ДатаНачала
|ИЗ РегистрСведений.РаботыПоПроекту.СрезПоследних(&ДатаСреза,) КАК
|РаботыПоПроектуСрезПоследних
.

Так не совсем то что нужно. Так минимальной датой может стать ДатаСреза. А нужно чтобы минимальная из не нулевых значений.

Как составить запрос с выборкой по минимальной дате и ещё одному условию?

Есть таблица с именем example. В ней 3 поля: name (TEXT), status (TEXT), date (TIMESTAMP).

Нужно извлечь один «name», у когорого status=’free’ и с минимальной датой.

Вот мой запрос: select name from example where timestamp(date) IN (select timestamp(min(date)) from example) and status = 'free' LIMIT 1;

Проблема: запрос работает до тех пор, пока в таблице не появится name с другим статусом (например status=’stop’) и у этого name с другим статусом как раз таки будет самая минимальная дата. В таком случае этот запрос ничего не возвращает. То есть, как я понимаю, в этом случае он отбирает минимальную дату, независимо от значения status, а потом смотрит status, он не free и соответственно ничего не возвращается.

6175df5586346734087142.jpeg

Вот мне нужно, чтобы в выборку попал item1, так как у него минимальная дата и статус free. А запрос в этом случае не возвращает ничего, так как минимальная дата у item5 со статусом stop.

Пробовал ещё вот так:

select name from example where timestamp(date) IN (select timestamp(min(DATE)) and status = 'free' from example) and status = 'free' LIMIT 1;

Нужно как-то переписать запрос, чтобы он высчитывал минимальную дату (date) только из строк со статусом free. Если же есть строки с другими статусами, чтобы он их не считал.

  • Вопрос задан более двух лет назад
  • 1237 просмотров

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *