如何减少查询行不改变Teradata SQL的最终结果?



我在Teradata SQL中有如下查询:

CREATE TABLE ABC.SUMMARY AS
(
SELECT
DISTINCT A.NR,
A.DATE,
COUNT(DISTINCT B.ID) AS TRX_CNT,
MAX(CASE WHEN B.ID IS NOT NULL THEN 1 ELSE 0 END) AS TRX_AB
FROM BASE AS A
LEFT JOIN TRX_BASE AS B
ON A.NR = B.NR
WHERE 1=1
AND B.TRX_DATE BETWEEN ADD_MONTHS(TRUNC(CURRENT_DATE, 'MM'), -6) AND TRUNC(CURRENT_DATE, 
'MM')-1
GROUP BY 1, 2
)
WITH DATA PRIMARY INDEX(NR);

我需要收缩这段代码,我的问题是:我需要删除多余的行,不改变结果,如果他们被删除,使这段代码更容易。我想这些产品都是需要的,但我不敢肯定。

我可以从上面的代码中删除什么,以不改变这段代码的最终结果?

CREATE TABLE ABC.SUMMARY AS
(
SELECT
A.NR,
A.DATE,
COUNT(DISTINCT B.ID) TRX_CNT,
MAX(CASE WHEN B.ID IS NOT NULL THEN 1 ELSE 0 END) TRX_AB
FROM BASE A
INNER JOIN TRX_BASE B
ON A.NR = B.NR
WHERE B.TRX_DATE BETWEEN ADD_MONTHS(TRUNC(CURRENT_DATE, 'MM'), -6) AND TRUNC(CURRENT_DATE, 
'MM')-1
GROUP BY A.NR, A.Date
)
WITH DATA PRIMARY INDEX(NR);

剩余的问题:

  1. date可以是保留字,也可以不是。因此,我尽量避免这样的列,并将它们别名出来,以定义日期,如Base_Date或其他东西。
  2. 仍然不确定应该是内连接还是左连接。但是由于您不希望更改查询的性质,因此使用Inner是有意义的,因为当前查询的行为类似于内部连接。这是因为如果一条记录存在于base中,但不存在于trx_base中,它将被B.TRX_Date计算消除,因为不包含null。

我们删除了什么和为什么:

  1. 在NR上不同…组由处理它
  2. 1=1,这不会增加任何值,也不会更改数据。
  3. 按拼出的分组。如果有人更改代码,在前两列中添加一列,这将打破。
  4. 删除一样. .
  5. 将左连接更改为inner,因为您对B.TRX_Date的限制将消除左连接生成的所有空值:因此这是一个内部连接,更改它不会影响结果。

最新更新