У меня есть представление sql «данные», которое выглядит следующим образом:
Я хочу сохранить только комбинации «COSTCENTER» и «KONTONUMMER», в которых есть одна или несколько записей с «CALMONTH» >= 202301. Желаемый результат будет:
Сейчас я могу сделать это только для одного столбца «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
Вам следует определить все пары 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