【问题标题】:Teradata get row counts for previous two days and compareTeradata 获取前两天的行数并进行比较
【发布时间】:2019-10-17 00:37:26
【问题描述】:

我正在尝试设置数据检查,我们从表中获取今天和之前日期的行数。由于周末或节假日不加载,我不能说 DATE-1。

我想出了以下方法,以获取上一个日期:

SELECT
LOAD_DATE
,COUNT(LOAD_DATE) RW_COUNT
,ROW_NUMBER() OVER (ORDER BY LOAD_DATE ) AS LOAD_ROWNUM
FROM DATABASE1.TABLE1
WHERE LOAD_DATE >= DATE-6
GROUP BY 1

这会产生日期、计数并分配行号。

LOAD_DATE   RW_COUNT    LOAD_ROWNUM
2019-10-16  8259        1
2019-10-15  8253        2
2019-10-11  8256        3
2019-10-10  8243        4

我将获取两个最新的日期并进行比较。大多数电流将是“当前”,第二大电流将是“之前”。然后我想有这样的结果集:

CURRENT_COUNT   PRIOR_COUNT DIFF_PERCENT
8259            8253        .9927

我的问题是,如何引用前两行并将它们相互比较?除非我想太多,否则我需要两个额外的 SELECT 语句:1 个 WHERE 子句引用第 1 行,另一个 WHERE 子句引用第 2 行。

我该怎么做?我有两个 CTE 吗?
最终,我需要第三个 SELECT 来划分两行并检查 10% 的容差。求助,我的分析瘫痪了。

【问题讨论】:

  • 样本数据和期望的结果会有所帮助。
  • 不清楚你真正想要做什么,但你可以把查询的输出扔到一个易变的表中。然后你可以做一个自我加入,或者使用滞后。

标签: sql teradata


【解决方案1】:

您可以使用 QUALIFY 过滤 OLAP 函数的结果:

SELECT
   LOAD_DATE
  ,COUNT(LOAD_DATE) AS CURRENT_COUNT
   -- previous day's count
  ,LEAD(RW_COUNT)
   OVER (ORDER BY LOAD_DATE DESC) AS PRIOR_COUNT
-- if your TD version doesn't support LAG/LEAD (i.e. < 16.10)
--,MIN(RW_COUNT) 
-- OVER (ORDER BY LOAD_DATE DESC
--       ROWS BETWEEN 1 FOLLOWING AND 1 FOLLOWING) AS PRIOR_COUNT

   ,CAST(CURRENT_COUNT AS DECIMAL(18,4)) / PRIOR_COUNT AS DIFF_PERCENT
FROM DATABASE1.TABLE1
WHERE LOAD_DATE >= DATE-6
GROUP BY 1
-- return the latest row only
QUALIFY ROW_NUMBER() OVER (ORDER BY LOAD_DATE DESC) = 1

检查 10% 的容差

DIFF_PERCENT BETWEEN 0.9 and 1.1

与 QUALIFY 或在 CASE 中进行与运算

【讨论】:

  • 完美,谢谢@dnoeth!我有这个: QUALIFY ROW_NUMBER() OVER (ORDER BY LOAD_DATE DESC) = 1 AND DIFF_PERCENT NOT BETWEEN 0.9 AND 1.1
【解决方案2】:

我不知道您想要的结果集是什么。但是你可以使用 LAG() 和聚合来获取之前的值。

SELECT LOAD_DATE, COUNT(*) as RW_COUNT,
       LAG(COUNT(*)) OVER (ORDER BY LOAD_DATE) as PREV_RW_COUNT
FROM DATABASE1.TABLE1
WHERE LOAD_DATE >= DATE-6
GROUP BY 1;

您可能只想要两个计数的差异。

【讨论】:

    【解决方案3】:

    如果你的TD 版本(16.0+?)不支持LEAD/LAG,试试这个:

    SELECT 
      load_date, 
      RW_COUNT, 
      MAX(RW_COUNT) OVER(
        ORDER BY load_date DESC
        ROWS BETWEEN 1 PRECEDING AND 1 PRECEDING -- Get previous row's value
      ) AS RW_COUNT_prev
    FROM (
      SELECT load_date, COUNT(LOAD_DATE) RW_COUNT,
      FROM DATABASE1.TABLE1
      WHERE LOAD_DATE >= DATE-6
      GROUP BY 1
    ) src
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-10-28
      • 1970-01-01
      • 2014-01-24
      • 2021-11-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多