Подтвердить что ты не робот

SQL: группировка по минимальному значению в одном поле при выборе отдельных строк

Вот что я пытаюсь сделать. Скажем, у меня есть эта таблица t:

id | record_date | other_cols
18 | 2011-04-03  | x
18 | 2012-05-19  | y
18 | 2012-08-09  | z
19 | 2009-06-01  | a
19 | 2011-04-03  | b
19 | 2011-10-25  | c
19 | 2012-08-09  | d

Для каждого id я хочу выбрать строку, содержащую минимальную запись record_date. Поэтому я получаю:

id | record_date | other_cols
18 | 2011-04-03  | x
19 | 2009-06-01  | a

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

id | record_date | other_cols
18 | 2011-04-03  | x
19 | 2011-04-03  | b
19 | 2009-06-01  | a
4b9b3361

Ответ 1

Как насчет чего-то вроде

SELECT mt.*,     
FROM MyTable mt INNER JOIN
    (
        SELECT ID, MIN(Record_Date) MinDate
        FROM MyTable
        GROUP BY ID
    ) t ON mt.ID = t.ID AND mt.Record_Date = t.MinDate

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

Ответ 2

Я мог бы достичь вашего ожидаемого результата, просто сделав это в :

 SELECT id, min(record_date), other_cols 
  FROM mytable
  GROUP BY id

Это работает для вас?

Ответ 3

Чтобы получить самый дешевый продукт в каждой категории, вы используете функцию MIN() в коррелированном подзапросе следующим образом:

    SELECT categoryid,
       productid,
       productName,
       unitprice 
    FROM products a WHERE unitprice = (
                SELECT MIN(unitprice)
                FROM products b
                WHERE b.categoryid = a.categoryid)

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

Ответ 4

Это старый вопрос, но это может быть полезно для кого-то В моем случае я не могу использовать дополнительный запрос, потому что у меня есть большой запрос, и мне нужно использовать min() для моего результата, если я использую sub-запрос, db нужно повторно выполнить мой большой запрос. я использую Mysql

select t.* 
    from (select m.*, @g := 0
        from MyTable m --here i have a big query
        order by id, record_date) t
    where (1 = case when @g = 0 or @g <> id then 1 else  0 end )
          and (@g := id) IS NOT NULL

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

Ответ 5

Это просто:

select t2.id,t2.record_date,t2.other_cols 
from (select ROW_NUMBER() over(partition by id order by record_date)as rownum,id,record_date,other_cols from MyTable)t2 
where t2.rownum = 1