选择其中一对列存在最小日期的记录列

问题描述 投票:0回答:3

我有一个 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
sql mysql aggregate-functions
3个回答
1
投票

您应该识别任何至少有一个“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'

1
投票

一个简单的存在查询就可以做到这一点:

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

1
投票

您可以使用简单的

IN
子句,因为它们适用于 MySQL 中的多个列:

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

内部查询获取满足日期条件的所有对,外部查询添加其他列。

示例在这里:db<>fiddle

© www.soinside.com 2019 - 2024. All rights reserved.