sql 查询从 db2 中多个 table 的多列中获取最大日期
sql query to get max date from multiple columns of multiple table in db2
我有多个包含 date_modified 列的表,我需要使用所有这些表创建一个视图,但 date_modified 应该是这些表中的最大值 date_modified。
table1
id vendor_number fiscal_year date_created date_modified
1 124 2021 2021/11/01 2021/11/02
2 231 2021 2021/11/01 2021/11/03
3 232 2021 2021/11/02 NULL
4 234 2021 2021/11/02 NULL
table2
id fiscal_year discount_amt date_created date_modified
1 2021 10.30 2021/11/01 2021/11/03
2 2021 15.23 2021/11/01 2021/11/02
3 2021 17.45 2021/11/02 2021/11/02
4 2021 18.49 2021/11/02 NULL
table3
id vendor_number date_created date_modified
1 124 2021/11/01 2021/11/04
2 231 2021/11/01 2021/11/01
3 232 2021/11/01 2021/11/03
4 234 2021/11/02 2021/11/03
Required Output :
id|fiscal_year|discount_amt|vendor_number|date_created|date_modified
1 | 2021 | 10.30 | 124 | 2021/11/01 | 2021/11/04
2 | 2021 | 15.23 | 231 | 2021/11/01 | 2021/11/03
3 | 2021 | 17.45 | 232 | 2021/11/02 | 2021/11/03
4 | 2021 | 18.49 | 234 | 2021/11/02 | 2021/11/03
查看SQL:
CREATE VIEW view_data
AS
SELECT T1.id, T1.fiscal_year, T2.discount_amt, T3.vendor_number, T1.date_created, max(multiple date_modified columns..from multiple tables..)
FROM table1 AS T1
LEFT JOIN table2 AS T2
ON T1.id = T2.id
LEFT JOIN T3 v
ON T1.vendor_number = T3.vendor_number;
假设 id
列是每个 table 的键,您可以连接它们(可能使用完全外部连接)然后使用 GREATEST()
获取最新日期。
例如:
create view v as
select
coalesce(a.id, b.id, c.id) as id,
b.fiscal_year,
b.discount_amt,
a.date_created,
greatest(a.date_modified, b.date_modified, c.date_modified) as date_modified
from table1 a
full join table2 b on b.id = a.id
full join table3 c on c.id = b.id or c.id = a.id
编辑:如果您的 DB2 版本没有实现 GREATEST()
,您可以将其替换为 [相当长] CASE
子句:
case when a.date_modified > b.date_modified then
case when a.date_modified > c.date_modified
then a.date_modified else c.date_modified end
else
case when b.date_modified > c.date_modified
then b.date_modified else c.date_modified end
end
或者,您可以自己实现该功能。这很简单。例如:
create function greatest(in a date, in b date) returns date
language sql
begin
if a > b then return a; end if;
return b;
end
//
在 db<>fiddle 1 查看此自定义函数的 运行 示例。
编辑#2:处理空值
空值不是值,数据库的行为是正确的。在存在未知日期的情况下,引擎无法确定哪个日期更大,并且 returns UNKNOWN
-- 以 null 的形式。
现在,如果您希望 null 的行为与 C、Java、PHP 等编程语言中的行为相同,那么您可以 1) 使用大量 CASE
/COALESCE
子句,或者您可以根据需要简单地将自定义函数修改为 wotk。下面是修改后的自定义函数的示例:
create function mygreatest(in a date, in b date) returns date
language sql
begin
if a is null then return b; end if;
if b is null then return a; end if;
if a > b then return a; end if;
return b;
end
然后,您可以看到它的实际效果:
with data (x, y) as (
select date '2021-07-01', date '2021-12-01' from sysibm.sysdummy1
union all select date '2021-07-01', null from sysibm.sysdummy1
union all select null, date '2021-12-01' from sysibm.sysdummy1
union all select null, null from sysibm.sysdummy1
)
select mygreatest(x, y) as g from data;
结果:
G
----------
2021-12-01
2021-07-01
2021-12-01
null
参见 db<>fiddle 2 中的 运行 示例。
我有多个包含 date_modified 列的表,我需要使用所有这些表创建一个视图,但 date_modified 应该是这些表中的最大值 date_modified。
table1
id vendor_number fiscal_year date_created date_modified
1 124 2021 2021/11/01 2021/11/02
2 231 2021 2021/11/01 2021/11/03
3 232 2021 2021/11/02 NULL
4 234 2021 2021/11/02 NULL
table2
id fiscal_year discount_amt date_created date_modified
1 2021 10.30 2021/11/01 2021/11/03
2 2021 15.23 2021/11/01 2021/11/02
3 2021 17.45 2021/11/02 2021/11/02
4 2021 18.49 2021/11/02 NULL
table3
id vendor_number date_created date_modified
1 124 2021/11/01 2021/11/04
2 231 2021/11/01 2021/11/01
3 232 2021/11/01 2021/11/03
4 234 2021/11/02 2021/11/03
Required Output :
id|fiscal_year|discount_amt|vendor_number|date_created|date_modified
1 | 2021 | 10.30 | 124 | 2021/11/01 | 2021/11/04
2 | 2021 | 15.23 | 231 | 2021/11/01 | 2021/11/03
3 | 2021 | 17.45 | 232 | 2021/11/02 | 2021/11/03
4 | 2021 | 18.49 | 234 | 2021/11/02 | 2021/11/03
查看SQL:
CREATE VIEW view_data
AS
SELECT T1.id, T1.fiscal_year, T2.discount_amt, T3.vendor_number, T1.date_created, max(multiple date_modified columns..from multiple tables..)
FROM table1 AS T1
LEFT JOIN table2 AS T2
ON T1.id = T2.id
LEFT JOIN T3 v
ON T1.vendor_number = T3.vendor_number;
假设 id
列是每个 table 的键,您可以连接它们(可能使用完全外部连接)然后使用 GREATEST()
获取最新日期。
例如:
create view v as
select
coalesce(a.id, b.id, c.id) as id,
b.fiscal_year,
b.discount_amt,
a.date_created,
greatest(a.date_modified, b.date_modified, c.date_modified) as date_modified
from table1 a
full join table2 b on b.id = a.id
full join table3 c on c.id = b.id or c.id = a.id
编辑:如果您的 DB2 版本没有实现 GREATEST()
,您可以将其替换为 [相当长] CASE
子句:
case when a.date_modified > b.date_modified then
case when a.date_modified > c.date_modified
then a.date_modified else c.date_modified end
else
case when b.date_modified > c.date_modified
then b.date_modified else c.date_modified end
end
或者,您可以自己实现该功能。这很简单。例如:
create function greatest(in a date, in b date) returns date
language sql
begin
if a > b then return a; end if;
return b;
end
//
在 db<>fiddle 1 查看此自定义函数的 运行 示例。
编辑#2:处理空值
空值不是值,数据库的行为是正确的。在存在未知日期的情况下,引擎无法确定哪个日期更大,并且 returns UNKNOWN
-- 以 null 的形式。
现在,如果您希望 null 的行为与 C、Java、PHP 等编程语言中的行为相同,那么您可以 1) 使用大量 CASE
/COALESCE
子句,或者您可以根据需要简单地将自定义函数修改为 wotk。下面是修改后的自定义函数的示例:
create function mygreatest(in a date, in b date) returns date
language sql
begin
if a is null then return b; end if;
if b is null then return a; end if;
if a > b then return a; end if;
return b;
end
然后,您可以看到它的实际效果:
with data (x, y) as (
select date '2021-07-01', date '2021-12-01' from sysibm.sysdummy1
union all select date '2021-07-01', null from sysibm.sysdummy1
union all select null, date '2021-12-01' from sysibm.sysdummy1
union all select null, null from sysibm.sysdummy1
)
select mygreatest(x, y) as g from data;
结果:
G
----------
2021-12-01
2021-07-01
2021-12-01
null
参见 db<>fiddle 2 中的 运行 示例。