【问题标题】:group a set of records by date in teradata在 teradata 中按日期对一组记录进行分组
【发布时间】:2014-01-26 00:29:35
【问题描述】:

目前我的表格中有如下数据:

date        id   value
1-Jan-13    1    100
2-Jan-13    1    100
3-Jan-13    1    100
4-Jan-13    1    200
5-Jan-13    1    200
6-Jan-13    1    100
7-Jan-13    1    100

我正在尝试根据 id 和 val 以及带有 startdate 和 end date 的版本记录对记录进行分组。

期望的输出:

start date  end date    id   value
1-Jan-13    3-Jan-13    1    100
4-Jan-13    5-Jan-13    1    200
6-Jan-13    7-Jan-13    1    100

【问题讨论】:

  • 您的分组标准究竟是什么?如我所见,第一组是三天,另外两组是两天。怎么样?
  • im 基于 id 和 value 的分组。这样我就可以从中创建一个版本..
  • 也许这个问题给了你一个线索-stackoverflow.com/questions/13037749/…
  • 我不太确定它如何与 teradata 一起使用 :(

标签: sql date grouping teradata


【解决方案1】:

我不是 Teradata 方面的专家,但你很可能,因为支持窗口函数(特别是 ROW_NUMBER),所以能够做这样的事情

SELECT MIN(date) start_date, MAX(date) end_date, id, value
  FROM
(
  SELECT date, id, value,
         ROW_NUMBER() OVER (PARTITION BY id ORDER BY date) -
         ROW_NUMBER() OVER (PARTITION BY id, value ORDER BY date) island
    FROM table1
) q
 GROUP BY id, value, island 
 ORDER BY start_date, end_date

样本输出:

| START_DATE | END_DATE |身份证 |价值 | |------------|------------|----|--------| | 2013-01-01 | 2013-01-03 | 1 | 100 | | 2013-01-04 | 2013-01-05 | 1 | 200 | | 2013-01-06 | 2013-01-07 | 1 | 100 |

这是 SQLFiddle 演示(这是一个 SQL Server 演示,但在 Teradata 中应该可以正常工作

【讨论】:

  • 有帮助吗?您的问题需要更多帮助吗?
【解决方案2】:

ROW_NUMBER 版本可以进一步简化:modified SQL Fiddle

对于 Teradata:

SELECT 
   id,val,MIN(dt),MAX(dt)
FROM
 (
   SELECT
      id,val,dt,
      dt - ROW_NUMBER() OVER (PARTITION BY id ORDER BY val, dt) AS dummy
   FROM table1
 ) AS dt
GROUP BY 1,2,dummy

TD13.10 中还有一些鲜为人知的函数用于处理时间序列数据:

WITH cte(id,val,pd) AS 
 (
   SELECT id, val, PERIOD(dt, dt+1) AS pd
   FROM table1
 )
SELECT
   id, val,
   BEGIN(pd) AS start_dt,
   LAST(pd) AS end_dt
FROM
   TABLE (TD_NORMALIZE_MEET
           (NEW VARIANT_TYPE(cte.id,cte.val)
           ,cte.pd)
   RETURNS (id INTEGER
           ,val INTEGER
           ,pd PERIOD(DATE)
           ,Nrm_Count INTEGER)
   HASH BY id
   LOCAL ORDER BY id, val, pd
   ) A 
ORDER BY start_dt, end_dt

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-15
    • 2020-05-23
    • 2014-01-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多