0

请帮忙,我有一张表,其中包含过去 3 年客户记录的更改历史记录。我需要输出每个客户在“每个”月的“最后一天”的状态或记录。

该表如下所示:

表 A:

| 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|

from_date我可以通过下面的 sql获取列中可见的所有月份的最后一天记录。但是对于未列出的月份或介于from_dateandto_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|

4

2 回答 2

1

您可以使用 Teradata 的EXPAND ON子句。为此,我们PERIOD从您的数据类型中创建一个数据类型from_dateto_date然后使用该数据类型EXPAND ON将该时间段分成多个MONTH_END块。

这看起来像:

 SELECT yourtable.*, BEGIN(bg) 
 FROM yourtable
 EXPAND ON PERIOD(from_date, NEXT(to_date)) AS by BY ANCHOR MONTH_END;

可能不得不对那里的语法进行一些修改,但它应该让你在球场上。

于 2021-09-07T15:59:51.837 回答
0

TD 16.20+ 支持所谓的时间序列聚合。这应该返回您的预期结果:

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)
于 2021-09-07T21:50:49.323 回答