按日期将 Table 转换为新的从到 Table
Transform Table by Date into a New From-To Table
我们在铁路上有一个基础设施系统。所有组件都有 Valid_From 和 Valid_To 日期。对于给定的项目,我们最多需要加入 8 tables,并且每一层都可以有不同的周期。因此,获得每一层正确组合的唯一快速方法是使用日期 table 执行此操作。
工作正常且正确。
但现在我以 table.
为例
CREATE TABLE [ods_tr_amelie].[INES_DATA_PREP_INES_ROUTING_OK]
(
[MAP_DATE] [DATE] NULL,
[FROM_ID_PK] [BIGINT] NOT NULL,
[FROM_INES_KPO] [INT] NULL,
[TO_ID_PK] [BIGINT] NOT NULL,
[ROUT_MAX_SPEED] [INT] NULL
)
WITH
(
DISTRIBUTION = HASH ( [MAP_DATE] ),
CLUSTERED COLUMNSTORE INDEX
)
现在我想将其转换回 VALID_FROM - VALID_TO table。但是...因为这是 运行 在 Azure SQL 数据仓库上,我不能使用游标,必须在正常选择中完成,并在需要时引用自身。
应该创建什么时期的关键是FROM_ID_PK、FROM_INES_KPO、TO_ID_PK和ROUT_MAX_SPEED。
MIN(MAP_DATE) 和 MAX(MAP_DATE) 不正确,如下面的简化数据示例所示。
MAP_DATE SYMBOLIC_KEY
01/01/2020 VALUE_X
01/02/2020 VALUE_Y
01/03/2020 VALUE_X
01/04/2020 VALUE_X
MIN_MAX 会创造
SYMBOLIC_KEY VALID_FROM VALID_TO
VALUE_X 01/01/2020 01/04/2020
VALUE_Y 01/02/2020 01/02/2020
想要的结果是
SYMBOLIC_KEY VALID_FROM VALID_TO
VALUE_X 01/01/2020 01/01/2020
VALUE_Y 01/02/2020 01/02/2020
VALUE_X 01/03/2020 01/04/2020
任何建议都很好..
这是一个间隙和孤岛问题。您可以使用 row_number()
和聚合:
select symbolic_value, min(map_date), max(map_date)
from (select t.*,
row_number() over (order by map_date) as seqnum,
row_number() over (partition by symbolic_value order by map_date) as seqnum_1
from INES_DATA_PREP_INES_ROUTING_OK t
) t
group by symbolic_value, (seqnum - seqnum_1);
注意:您的数据没有日期间隔。这个版本忽略了差距。如果您希望他们创建单独的组,则:
select symbolic_value, min(map_date), max(map_date)
from (select t.*,
row_number() over (order by map_date) as seqnum
from INES_DATA_PREP_INES_ROUTING_OK t
) t
group by symbolic_value, datediff(day, - seqnum, map_date);
我们在铁路上有一个基础设施系统。所有组件都有 Valid_From 和 Valid_To 日期。对于给定的项目,我们最多需要加入 8 tables,并且每一层都可以有不同的周期。因此,获得每一层正确组合的唯一快速方法是使用日期 table 执行此操作。 工作正常且正确。 但现在我以 table.
为例CREATE TABLE [ods_tr_amelie].[INES_DATA_PREP_INES_ROUTING_OK]
(
[MAP_DATE] [DATE] NULL,
[FROM_ID_PK] [BIGINT] NOT NULL,
[FROM_INES_KPO] [INT] NULL,
[TO_ID_PK] [BIGINT] NOT NULL,
[ROUT_MAX_SPEED] [INT] NULL
)
WITH
(
DISTRIBUTION = HASH ( [MAP_DATE] ),
CLUSTERED COLUMNSTORE INDEX
)
现在我想将其转换回 VALID_FROM - VALID_TO table。但是...因为这是 运行 在 Azure SQL 数据仓库上,我不能使用游标,必须在正常选择中完成,并在需要时引用自身。
应该创建什么时期的关键是FROM_ID_PK、FROM_INES_KPO、TO_ID_PK和ROUT_MAX_SPEED。
MIN(MAP_DATE) 和 MAX(MAP_DATE) 不正确,如下面的简化数据示例所示。
MAP_DATE SYMBOLIC_KEY
01/01/2020 VALUE_X
01/02/2020 VALUE_Y
01/03/2020 VALUE_X
01/04/2020 VALUE_X
MIN_MAX 会创造
SYMBOLIC_KEY VALID_FROM VALID_TO
VALUE_X 01/01/2020 01/04/2020
VALUE_Y 01/02/2020 01/02/2020
想要的结果是
SYMBOLIC_KEY VALID_FROM VALID_TO
VALUE_X 01/01/2020 01/01/2020
VALUE_Y 01/02/2020 01/02/2020
VALUE_X 01/03/2020 01/04/2020
任何建议都很好..
这是一个间隙和孤岛问题。您可以使用 row_number()
和聚合:
select symbolic_value, min(map_date), max(map_date)
from (select t.*,
row_number() over (order by map_date) as seqnum,
row_number() over (partition by symbolic_value order by map_date) as seqnum_1
from INES_DATA_PREP_INES_ROUTING_OK t
) t
group by symbolic_value, (seqnum - seqnum_1);
注意:您的数据没有日期间隔。这个版本忽略了差距。如果您希望他们创建单独的组,则:
select symbolic_value, min(map_date), max(map_date)
from (select t.*,
row_number() over (order by map_date) as seqnum
from INES_DATA_PREP_INES_ROUTING_OK t
) t
group by symbolic_value, datediff(day, - seqnum, map_date);