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

У меня есть представление sql «данные», которое выглядит следующим образом:

КАЛМОНС ЦЕНТР ЗАТРАТ КОНТОНУММЕР ПОЛЕDNM003 202212 Альфа 123 10 202301 Альфа 123 20 202210 Альфа 223 50 202307 Бета 123 10

Я хочу сохранить только комбинации «COSTCENTER» и «KONTONUMMER», в которых есть одна или несколько записей с «CALMONTH» >= 202301. Желаемый результат будет:

КАЛМОНС ЦЕНТР ЗАТРАТ КОНТОНУММЕР ПОЛЕDNM003 202212 Альфа 123 10 202301 Альфа 123 20 202307 Бета 123 10

Сейчас я могу сделать это только для одного столбца «COSTCENTER»:

SELECT "t"."CALMONTH", "t"."COSTCENTER", "t"."KONTONUMMER", "t"."FIELDNM003"
FROM "data" AS t
INNER JOIN (
  SELECT "COSTCENTER"
  FROM "data"
  GROUP BY "COSTCENTER"
  HAVING MAX("CALMONTH") > 202301
) AS s ON s.COSTCENTER = t.COSTCENTER
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
1
0
68
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

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

Вам следует определить все пары COSTCENTER и Kontonummer, в которых есть хотя бы одна запись, где «CALMONTH» >= 202301. Найдя эти пары, соедините их со своей таблицей, чтобы получить все соответствующие строки:

SELECT t.*
FROM mytable t
inner join (
  select COSTCENTER, Kontonummer
  from mytable
  where CALMONTH >= 202301
  group by COSTCENTER, Kontonummer
) as s on s.COSTCENTER = t.COSTCENTER
       and s.Kontonummer = t.Kontonummer;

Демо здесь

Если вы используете MySQL 8 или выше, это другой способ сделать это с помощью оконной функции MAX():

select CALMONTH, COSTCENTER, Kontonummer, FIELDNM003
from (
  select *, max(CALMONTH) over (partition by COSTCENTER, Kontonummer) as max_CALMONTH
  from mytable
) as s
where max_CALMONTH >= '202301'

Простой запрос на существование должен сделать это:

SELECT *
FROM data AS t
WHERE EXISTS (
    SELECT *
    FROM data AS x
    WHERE costcenter = t.costcenter
    AND   kontonummer = t.kontonummer
    AND   calmonth >= 202301
)

Вы можете использовать простое предложение IN, поскольку оно работает с несколькими столбцами в MySQL:

SELECT *
FROM mytable
WHERE
  (costcenter, kontonummer) IN
    (SELECT costcenter, kontonummer
     FROM mytable
     WHERE calmonth >= 202301);

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

Пример здесь: db<>fiddle

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

Похожие вопросы