我有一个 sql 视图“数据”,如下所示:
卡尔月 | 成本中心 | KONTONNUMMER | FIELDNM003 |
---|---|---|---|
202212 | 阿尔法 | 123 | 10 |
202301 | 阿尔法 | 123 | 20 |
202210 | 阿尔法 | 223 | 50 |
202307 | 测试版 | 123 | 10 |
我只想保留“COSTCENTER”和“KONTONUMMER”的组合,其中一个或多个条目的“CALMONTH”> = 202301。所需的输出将是:
卡尔月 | 成本中心 | KONTONNUMMER | FIELDNM003 |
---|---|---|---|
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
您应该识别任何至少有一个“CALMONTH”> = 202301 条目的 COSTCENTER 和 Kontonummer 对。找到这些对后,将它们与您的表连接以检索所有相应的行:
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