sql - SQL 引导函数 SQL Netezza
问题描述
我有一张表,其中只有一个 line_id 的以下示例。
LINE_ID|COLLECTION_DATE |DSL_CARD_TYPE|
-------|-------------------|-------------|
1234567|2020-03-25 08:46:08|ADSL_PORT |
1234567|2020-03-26 08:31:48|ADSL_PORT |
1234567|2020-03-27 08:42:40|VDSL_PORT |
1234567|2020-03-28 08:36:32|VDSL_PORT |
1234567|2020-03-29 08:31:33|VDSL_PORT |
1234567|2020-03-30 08:50:15|VDSL_PORT |
1234567|2020-04-31 08:44:33|ADSL_PORT |
1234567|2020-03-01 08:34:53|ADSL_PORT |
1234567|2020-04-02 08:44:11|ADSL_PORT |
1234567|2020-04-03 08:43:51|VDSL_PORT |
1234567|2020-04-04 08:54:33|ADSL_PORT |
1234567|2020-04-05 09:06:47|ADSL_PORT |
1234567|2020-04-06 09:06:57|VDSL_PORT |
1234567|2020-04-07 09:13:32|VDSL_PORT |
我需要对 DSL_CARD_TYPE 进行分组并创建一个名为 Next_COLLECTION_DATE 的新列以获取下一个 DSL_CARD_TYPE 并返回每个 Next_group 中的第一个日期,但如下所示
LINE_ID|COLLECTION_DATE |Next_COLLECTION_DATE |DSL_CARD_TYPE|
-------|-------------------|----------------------|-------------|
1234567|2020-03-25 08:46:08|2020-03-27 08:42:40 |ADSL_PORT |
1234567|2020-03-27 08:42:40|2020-03-31 08:34:53 |VDSL_PORT |
1234567|2020-03-31 08:34:53|2020-04-03 08:43:51 |ADSL_PORT |
1234567|2020-04-03 08:43:51|2020-04-04 08:54:33 |VDSL_PORT |
1234567|2020-04-04 08:54:33|2020-04-06 09:06:57 |ADSL_PORT |
1234567|2020-04-06 09:06:57|2020-04-07 09:13:32 |VDSL_PORT |
我有以下代码,它返回每组中的最后一个日期
select line_id, dsl_card_type, min(collection_date), max(collection_date)
from (select v.*,
row_number() over (partition by line_id order by collection_date) as seqnum,
row_number() over (partition by line_id, dsl_card_type order by collection_date) as seqnum_2
from ANALYTICS.tmp.V_PORTS_LINE_CARD_DATA_ALL v
where collection_date >= '2020-07-27 00:00:00'
) v
group by line_id, dsl_card_type, (seqnum - seqnum_2);```
解决方案
您可以lead()
在外部查询中使用:
select
line_id,
dsl_card_type,
min(collection_date) as first_collection_date,
lead(min(collection_date)) over(partition by line_id order by min(collection_date)) next_collection_date
from (select v.*,
row_number() over (partition by line_id order by collection_date) as seqnum,
row_number() over (partition by line_id, dsl_card_type order by collection_date) as seqnum_2
from ANALYTICS.tmp.V_PORTS_LINE_CARD_DATA_ALL v
where collection_date >= '2020-07-27 00:00:00'
) v
group by line_id, dsl_card_type, (seqnum - seqnum_2)
推荐阅读
- spring-boot - 当 REST API 中的自动绑定失败时,@ExceptionHandler 不起作用
- java - 通过 HTTPS 的 Spring Cloud 配置服务器
- solr - Solr 索引 PDF/DOC 后集合中没有“内容”字段
- c# - 如何在 C# 中的 DetectDocumentText 调用上设置 quotaUser?
- python - 如何动态地将作业添加到 Scrapy/Selenium 蜘蛛?
- flask - Flask 表单不会为无效令牌引发 CSRFError
- angular - 如何通过命令行在 cypress.json 文件中设置环境变量?(Angular CLI - nrwl nx)
- javascript - 有没有办法为生成的 .d.ts 文件(在 javascript 项目中)声明特定的模块名称?
- javascript - 如何在 TypeScript 中通过添加类似 ++ 的函数来扩展 Number
- tensorflow - 图像的维度作为 LeNet_5 的输入