Получить самую старую метку времени от каждого user_id - PullRequest
0 голосов
/ 03 мая 2018

База данных "Продажи"

Каждый "sold_by" - это человек, который совершил эту конкретную продажу. Моя цель состоит в том, чтобы самая последняя «sale_date», сгруппированная по «sold_by», возвращала одну запись для каждой уникальной записи «sold_by» (которая хранится как целое число в моей базе данных, но это пример)

╔═════════╦═════════╦══════════════════╗
║ sale_id ║ sold_by ║    sale_date     ║
╠═════════╬═════════╬══════════════════╣
║       0 ║ PETER   ║ 01/01/2017 00:00 ║
║       1 ║ JOHN    ║ 01/01/2017 00:00 ║
║       2 ║ PETER   ║ 30/03/2017 00:00 ║
║       3 ║ JOHN    ║ 03/02/2017 00:00 ║
║       4 ║ SIMON   ║ 04/02/2017 00:00 ║
║       5 ║ JOHN    ║ 05/01/2017 00:00 ║
║       6 ║ SIMON   ║ 26/01/2017 00:00 ║
║       7 ║ PETER   ║ 07/01/2017 00:00 ║
║       8 ║ SIMON   ║ 28/01/2017 00:00 ║
║       9 ║ JOHN    ║ 09/01/2017 00:00 ║
║       0 ║ PETER   ║ 20/01/2017 00:00 ║
╚═════════╩═════════╩══════════════════╝

Пример базы данных для account_manager_sellers (обратите внимание, идентификатор соответствует sold_by в таблице выше.

╔════╦══════════════╗
║ id ║ company_name ║
╠════╬══════════════╣
║  0 ║ PETER        ║
║  1 ║ JOHN         ║
║  2 ║ SIMON        ║
╚════╩══════════════╝

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

SELECT `sold_by`, `sale_date`
FROM   `sales`
  NATURAL JOIN (
    SELECT   `sold_by`, MAX(`sale_date`) AS entry_date
    FROM     `sales`
    GROUP BY `sold_by`
  ) AS tmin
  JOIN `account_manager_sellers` USING (`id`)
  WHERE `sale_date` < '2017-03-31 00:00:00';

ОБНОВЛЕНИЕ: (Я также обновил код выше, чтобы соответствовать правильным именам столбцов) В конечном счете, мне нужно получить ОДНУ запись для каждого уникального sold_by, но это должна быть самая последняя дата. Таким образом, из первой таблицы, приведенной выше, он вернется:

+---+-------+------------------+
| 2 | PETER | 30/03/2017 00:00 | 
+---+-------+------------------+
| 3 | JOHN  | 03/02/2017 00:00 | 
+---+-------+------------------+
| 4 | SIMON | 04/02/2017 00:00 |
+---+-------+------------------+

P.S. Я также попытался удалить MAX (sale_date) из подзапроса и заменить его ORDER BY sale_date LIMIT 1 (но, очевидно, он вернул только один единственный результат)

Большое спасибо в ожидании

1 Ответ

0 голосов
/ 03 мая 2018

Основной запрос, который вы хотите, может выглядеть примерно так:

SELECT p1.*
FROM plans p1
INNER JOIN
(
    SELECT seller_id, MAX(plan_written) AS entry_date
    FROM plans
    GROUP BY seller_id
) p2
    ON p1.seller_id = p2.seller_id AND
       p1.plan_written = p2.entry_date;

У вас также есть еще одно соединение с таблицей account_manager_sellers, но, поскольку я не вижу ваши определения таблиц, не знаю ваших столбцов и т. Д., Я не буду пытаться ответить на этот вопрос.

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

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