如何显示每个客户每个月的最后一条记录?
How to show the last record of each customer for each month?
请帮忙,我有一个 table 包含过去 3 年客户记录的更改历史。
我需要输出每个客户在“每个”月的“最后一天”的状态或记录。
table 看起来像这样:
Table答:
| ID | Name | Number|from_date(in Timestamp)|to_date(in Timestamp)|
|:--- |:----:|:-----:|----------------------:|--------------------:|
|123 | John | 101 |20210101 01:11:15 |20210103 01:11:15 |
|123 | John | 102 |20210103 01:11:15 |20210301 01:11:15 |
|123 | John | 103 |20210301 01:11:15 |20210325 01:11:15 |
|123 | John | 104 |20210325 01:11:15 |20210415 01:11:15 |
|123 | John | 105 |20210415 01:11:15 |20210416 01:11:15 |
|123 | John | 106 |20210416 01:11:15 |20210525 01:11:15 |
|123 | John | 104 |20210525 01:11:15 |20210915 01:11:15 |
|123 | John | 105 |20210915 01:11:15 |null |
鉴于以上数据,遗憾的是没有记录 2 月、6 月、7 月、8 月和 9 月
但我需要显示“每个”月(1 月到 12 月)的客户数据。
预期输出应如下所示:
| ID | Name | Number|Date |
|123 | John | 102 |20210131|
|123 | John | 102 |20210228|
|123 | John | 104 |20210331|
|123 | John | 106 |20210430|
|123 | John | 104 |20210531|
|123 | John | 104 |20210630|
|123 | John | 104 |20210731|
|123 | John | 104 |20210831|
|123 | John | 104 |20210931|
我可以通过下面的sql获取from_date
列中可见的所有月份的最后一天记录。
但是对于未列出的月份或 from_date
和 to_date
列之间的月份,我很难显示它。
select a.id, a.name, a.number, last_day(a.from_date) Date
from (select a.*, row_number() over (partition by a.id, trunc(from_date, 'MON')
order by from_date desc) as seqnum from tableA a
) a where seqnum = 1;
供您参考,上面的 sql 输出如下所示:
| ID | Name | Number|Date |
|123 | John | 102 |20210131|
|123 | John | 104 |20210331|
|123 | John | 106 |20210430|
|123 | John | 106 |20210531|
|123 | John | 106 |20210931|
您可以使用 Teradata 的 EXPAND ON 子句。为此,我们从您的 from_date
和 to_date
创建了一个 PERIOD
数据类型,然后使用 EXPAND ON
将该时间段分成 MONTH_END
个块。
这看起来像:
SELECT yourtable.*, BEGIN(bg)
FROM yourtable
EXPAND ON PERIOD(from_date, NEXT(to_date)) AS by BY ANCHOR MONTH_END;
可能需要稍微修改一下语法,但它应该能让您大致了解。
TD 16.20+ 支持所谓的时间序列聚合。这应该 return 您的预期结果:
select id, name
,last(number)
,cast(end($TD_TIMECODE_RANGE) as date)
from table1
group by time(CAL_MONTHS(1) and id, name)
using timecode (from_date) fill (previous)
请帮忙,我有一个 table 包含过去 3 年客户记录的更改历史。 我需要输出每个客户在“每个”月的“最后一天”的状态或记录。
table 看起来像这样:
Table答:
| ID | Name | Number|from_date(in Timestamp)|to_date(in Timestamp)|
|:--- |:----:|:-----:|----------------------:|--------------------:|
|123 | John | 101 |20210101 01:11:15 |20210103 01:11:15 |
|123 | John | 102 |20210103 01:11:15 |20210301 01:11:15 |
|123 | John | 103 |20210301 01:11:15 |20210325 01:11:15 |
|123 | John | 104 |20210325 01:11:15 |20210415 01:11:15 |
|123 | John | 105 |20210415 01:11:15 |20210416 01:11:15 |
|123 | John | 106 |20210416 01:11:15 |20210525 01:11:15 |
|123 | John | 104 |20210525 01:11:15 |20210915 01:11:15 |
|123 | John | 105 |20210915 01:11:15 |null |
鉴于以上数据,遗憾的是没有记录 2 月、6 月、7 月、8 月和 9 月 但我需要显示“每个”月(1 月到 12 月)的客户数据。
预期输出应如下所示:
| ID | Name | Number|Date |
|123 | John | 102 |20210131|
|123 | John | 102 |20210228|
|123 | John | 104 |20210331|
|123 | John | 106 |20210430|
|123 | John | 104 |20210531|
|123 | John | 104 |20210630|
|123 | John | 104 |20210731|
|123 | John | 104 |20210831|
|123 | John | 104 |20210931|
我可以通过下面的sql获取from_date
列中可见的所有月份的最后一天记录。
但是对于未列出的月份或 from_date
和 to_date
列之间的月份,我很难显示它。
select a.id, a.name, a.number, last_day(a.from_date) Date
from (select a.*, row_number() over (partition by a.id, trunc(from_date, 'MON')
order by from_date desc) as seqnum from tableA a
) a where seqnum = 1;
供您参考,上面的 sql 输出如下所示:
| ID | Name | Number|Date |
|123 | John | 102 |20210131|
|123 | John | 104 |20210331|
|123 | John | 106 |20210430|
|123 | John | 106 |20210531|
|123 | John | 106 |20210931|
您可以使用 Teradata 的 EXPAND ON 子句。为此,我们从您的 from_date
和 to_date
创建了一个 PERIOD
数据类型,然后使用 EXPAND ON
将该时间段分成 MONTH_END
个块。
这看起来像:
SELECT yourtable.*, BEGIN(bg)
FROM yourtable
EXPAND ON PERIOD(from_date, NEXT(to_date)) AS by BY ANCHOR MONTH_END;
可能需要稍微修改一下语法,但它应该能让您大致了解。
TD 16.20+ 支持所谓的时间序列聚合。这应该 return 您的预期结果:
select id, name
,last(number)
,cast(end($TD_TIMECODE_RANGE) as date)
from table1
group by time(CAL_MONTHS(1) and id, name)
using timecode (from_date) fill (previous)