Teradata 获取前两天的行数并进行比较
Teradata get row counts for previous two days and compare
我正在尝试设置数据检查,我们从 table 中获取今天和前一天的行数。由于周末或节假日不加载,所以我不能说 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" ,第二最新的是 "prior" 。然后我想要这样的结果集:
CURRENT_COUNT PRIOR_COUNT DIFF_PERCENT
8259 8253 .9927
我的问题是,如何引用前两行并将它们相互比较?除非我想太多了,否则我需要两个额外的 SELECT 语句:1 个带有引用第 1 行的 WHERE 子句,另一个带有引用第 2 行的 WHERE 子句。
我该怎么做?我有两个 CTE 吗?
最后,我需要第三个 SELECT 来划分两行并检查 10% 的公差。求助,我分析瘫痪了。
我不知道你想要什么结果集。但是您可以使用 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;
您可能只想要两个计数的差异。
您可以使用 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 中进行 AND 运算
如果您的 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
我正在尝试设置数据检查,我们从 table 中获取今天和前一天的行数。由于周末或节假日不加载,所以我不能说 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" ,第二最新的是 "prior" 。然后我想要这样的结果集:
CURRENT_COUNT PRIOR_COUNT DIFF_PERCENT
8259 8253 .9927
我的问题是,如何引用前两行并将它们相互比较?除非我想太多了,否则我需要两个额外的 SELECT 语句:1 个带有引用第 1 行的 WHERE 子句,另一个带有引用第 2 行的 WHERE 子句。
我该怎么做?我有两个 CTE 吗?
最后,我需要第三个 SELECT 来划分两行并检查 10% 的公差。求助,我分析瘫痪了。
我不知道你想要什么结果集。但是您可以使用 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;
您可能只想要两个计数的差异。
您可以使用 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 中进行 AND 运算
如果您的 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