Нахождение идентификатора строки при группировке по столбцу A и упорядочение по столбцу B - PullRequest
0 голосов
/ 29 апреля 2019

У меня есть таблица, которая состоит из множества столбцов, но релевантны только три:

id - INT
species - VARCHAR(5)
date - DATE

Я хочу найти следующее: Для каждого вида дайте мне идентификатор с самой низкой датой

Пример данных для одного вида:

id  | species | date
----------------------------
123 | 03100   | 2007-04-23
----------------------------
324 | 03100   | 2005-05-26

Я пытался сделать GROUP BY ORDER

SELECT * FROM `table` GROUP BY species ORDER BY `date` ASC;

RESULT:
id  | species | date
----------------------------
123 | 03100   | 2007-04-23

Я пытался упорядочить в дополнительном выборе перед группировкой:

SELECT 
    id, species, `date`
FROM
    (SELECT 
        *
    FROM
        `table`
    ORDER BY `date` ASC) sub
GROUP BY species;

RESULT:
id  | species | date
----------------------------
123 | 03100   | 2007-04-23

Результат должен быть

id  | species | date
----------------------------
324 | 03100   | 2005-05-26

, потому что дата является самой ранней для этого вида.

У нас есть около 1100 различных видов, поэтому я бы предпочел, если бы это моглосделать один запрос вместо 1100 запросов, по одному для каждого вида.

ОБНОВЛЕНИЕ: заранее извиняюсь, ваши предложения хороши, но мне трудно их реализовать, так как моя модель данных немного большесложнее, чем демо, которое я выложил:

TABLE: obs
------------------
id      | INT
species | VARCHAR
user_id | INT
trip_id | INT

TABLE: trips
------------------
trip_id | INT
dato    | DATE

На самом деле, мне нужно объединить obs и trips вместе, чтобы получить дату, а затем я должен найти идентификатор, вид и дату дляконкретные user_id

Я надеюсь, что вы все еще можете помочья: -)

С уважением, Андерс

Ответы [ 2 ]

0 голосов
/ 29 апреля 2019

Для больших данных я бы предложил что-то вроде:

SELECT t.*
FROM (
    SELECT species, MIN(date) AS min_date
    FROM t
    GROUP BY species
) AS a
JOIN t ON a.species = t.species AND a.min_date = t.date
0 голосов
/ 29 апреля 2019

Если вы хотите самую раннюю запись, я бы порекомендовал фильтрацию , а не агрегацию. Я бы использовал коррелированный подзапрос:

select t.*
from t
where t.date = (select min(t2.date) from t t2 where t2.species = t.species);

Если у вас может быть несколько дат и вам нужна только одна запись для каждого идентификатора, вы можете настроить это на:

select t.*
from t
where t.id = (select t2.id
              from t t2
              where t2.species = t.species
              order by t2.date asc, t2.id asc
             );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...