Получение данных из postgres с условиями

Рейтинг: 0Ответов: 2Опубликовано: 21.02.2023

Нужна небольшая помощь по запросу.

ТО, ЧТО В ТАБЛИЦЕ 20й МЕСЯЦ - ОПЕЧАТКА.

Есть таблица, в которой отмечены ученики и их посещение уроков.

пример таблицы

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

Запрос

SELECT * FROM my_table WHERE date = (CURRENT_DATE) ORDER BY id DESC LIMIT 5;

Этот запрос вернет мне просто последние 5 id, а как получить уникальные name и Lesson?

Желаемый результат

11 Яна Литература    
10 Федор Литература    
 8 Григорий Математика    
 7 Олег География    
 6 Анна История

Буду рад любой помощи. Заранее спасибо!

Ответы

▲ 0Принят

Если ваша задача абстрактный пример то что бы выделить первую или последнюю строку из группируемого диапазона вы можете воспользоваться оконной функцией first_value определив фрейм для поиска по имени ученика и дате проведения занятий:

SELECT DISTINCT name, first_value(lesson) 
  OVER ( PARTITION BY name, date ORDER BY id DESC) FROM heap ORDER BY name DESC LIMIT 5;

Так как коллеги согласны со мной, что это должен быть исключительно учебный пример, то если рассматривать варианты с подзапросом в плане производительности для PoatgreSQL представляет интерес подзапрос с LATERAL LIMIT без агрегатных функций:

SELECT DISTINCT h.name, l.lesson FROM heap h,
 LATERAL(SELECT lesson FROM heap WHERE name = h.name AND date = h.date ORDER BY id DESC LIMIT 1) l 
 ORDER BY h.name DESC

Поэкспериментировать можно здесь

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

▲ 0

Мне кажется, что задача учебная,в противном случае не очень нравится уникальность учеников по строковому полю, но в целом для учебной задачи я бы предложил вариант с подзапросом, в котором выбирается максимальный ID (как я понимаю это номер записи о посещении, который растет по мере посещения занятий) за текущую дату по каждому из учеников:

 SELECT A.id, A.name, A.lesson FROM my_table A WHERE A.ID IN (SELECT max(id) from my_table WHERE date = CURRENT_DATE  GROUP BY name) ORDER BY id;

Тогда вывод будет таким (при условии, что 21-20-2023 мы все же поменяем на 2023-02-22 сегодня ):

1 Василий  Физика
3 Дмитрий  Химия
6 Анна     История
7 Олег     География
8 Григорий Математика
10 Федор   Литература
11 Яна     Литература