Как получить дату MAX в запросе?

У меня есть две таблицы в базе данных Postgres:

table_1

Name    Address   Height    Weight   Date_Collected
X.        y         z.        p.       8/7/2024
G.        H.        I         J.       8/8/2024
Q         W.        E.        R.       8/9/2024

table_2

Name    Income     Tax    Date_Collected 
X.        y         z.      8/8/2024
A         B         C.      8/8/2024

Попытка сравнить строки между двумя таблицами и получить имена, которые появляются только в table_1, а не в table_2. Я также пытаюсь отфильтровать их по дате сбора MAX.

Вот что у меня есть, но я получаю синтаксическую ошибку:

SELECT count(DISTINCT "Name")
FROM table_1
WHERE table_1.Height NOT LIKE ANY CONCAT('%', {'I', 'E'} '%')
WHERE NOT EXISTS (
    SELECT DISTINCT UPPER("Name") FROM table_2
    WHERE MAX(table_2."Date Collected")
    AND table_2."Income" = 'y'
    AND UPPER(table_2."Name") LIKE CONCAT('%', UPPER(table_1."Name"), '%')
)

агрегатные функции не разрешены в «ГДЕ»

Поэтому я изменил его на:

SELECT count(DISTINCT "Name")
FROM table_1
WHERE table_1.Height NOT LIKE ANY CONCAT('%', {'I', 'E'} '%')
WHERE NOT EXISTS (
    SELECT DISTINCT UPPER("Name") FROM table_2
    WHERE  table_2."Income" = 'y'
    AND UPPER(table_2."Name") LIKE CONCAT('%', UPPER(table_1."Name"), '%')
    AND HAVING MAX(table_2."Date Collected")
)

Это дает мне синтаксическую ошибку. Удаление AND перед HAVING дает мне:

аргумент HAVING должен быть логическим, а не типом даты

Я предполагаю, что после использования должно быть какое-то условие. Если мне нужно использовать HAVING, каким должно быть условие, если я хочу получить максимальную дату? Могу ли я получить максимальную дату, не используя HAVING?

Сначала вам следует навести порядок в этой путанице идентификаторов в смешанном регистре в кавычках и без кавычек. Затем предоставьте четкое определение таблицы (оператор CREATE TABLE), примеры значений в виде оператора INSERT, версию Postgres и четкий вопрос.

Erwin Brandstetter 12.08.2024 23:51
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
1
1
50
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете получить максимальную дату, собранную из таблицы 2, а затем использовать предложение NOT EXISTS, чтобы отфильтровать имена, которые появляются в таблице 2.

Вот измененный запрос -

SELECT DISTINCT "Name"
FROM table_1
WHERE table_1.Height NOT LIKE ANY (CONCAT('%', ARRAY['I', 'E']) || '%')
AND NOT EXISTS (
SELECT 1
FROM table_2
WHERE table_2."Name" = table_1."Name"
AND table_2."Date_Collected" = (
    SELECT MAX("Date_Collected")
    FROM table_2
    WHERE "Name" = table_1."Name"
  )
)

Это сработало без последней строки. Спасибо за помощь.

winterlyrock 12.08.2024 19:08

@winterlyrock: Height NOT LIKE ANY (CONCAT('%', ARRAY['I', 'E']) || '%') — это синтаксическая ерунда. Последнее сравнение с максимальным "Date_Collected" с тем же именем не приносит никакой пользы в выражении подзапроса EXISTS. Этот запрос не может «работать», каким бы ни был вопрос.

Erwin Brandstetter 13.08.2024 00:10

Другие вопросы по теме