SQL - выбрать предельные значения column2 для отдельного столбца 1 - PullRequest
0 голосов
/ 13 декабря 2018

У меня есть

name:      date:
Mike       02-10-14
Will       03-31-18
Charlie    04-21-18
Mike       05-31-18
Will       04-11-17
Charlie    04-15-18
Mike       08-02-17
Will       09-16-18
Charlie    04-12-17
...        ...

Я хочу для каждого имени самые последние (2) даты в порядке убывания.

name:     date:
Mike      05-31-18
Mike      08-02-17
Will      09-16-18
Will      03-31-18
Charlie   04-21-19
Charlie   04-15-19

Я пробовал различные группы в / порядкеметодами / max / desc / unique / Different, но не может найти решение, которое содержит все имена.Мои попытки продолжают собирать 2 самые последние даты во всей таблице вместо одного человека.

Текущая попытка:

SELECT NAME, DATE FROM SIGHTINGS ORDER BY SIGHTED DESC LIMIT 2;

- возвращает 2 самые последние даты всей таблицы

Ответы [ 2 ]

0 голосов
/ 13 декабря 2018

Это будет работать, потому что сортирует, переформатируя даты в YY-MM-DD:

SELECT  
  t.NAME, t.DATE 
FROM SIGHTINGS AS t 
WHERE
  t.DATE IN (
    SELECT 
      DATE 
    FROM SIGHTINGS 
    WHERE SIGHTINGS.NAME = t.NAME
    ORDER BY SUBSTR(DATE, 7, 2) || '-' || SUBSTR(DATE, 1, 5) DESC LIMIT 2 
  )
ORDER BY t.NAME, SUBSTR(t.DATE, 7, 2) || '-' || SUBSTR(t.DATE, 1, 5) DESC;
0 голосов
/ 13 декабря 2018

A Функция окна с предложением Partition By будет наиболее уместным здесь: https://www.sqlite.org/windowfunctions.html. Прокрутите вниз до «2.2. Предложение PARTITION BY», также посмотритеrow_number () и rank () далее на той же странице.

Ниже приведен код, не проверенный, поскольку у меня нет доступа к базе данных sqlite.Таким образом, синтаксис может быть немного отключен.Мой самый знакомый - SQL Server.

SELECT t.name, 
       t.date
FROM 
(
    SELECT name,
           date,
           row_number() OVER (PARTITION BY name ORDER BY date DESC) AS recency
) as t
WHERE t.recency <= 2
ORDER BY t.name, t.date DESC

Кстати, концепция окна / раздела является общей в SQL.Я считаю, что SQL Server и Oracle имеют почти идентичный синтаксис.

...