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

How to decrease lines of query to do not change final result in 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. 日期may/may不是保留字。因此,我尽量避免使用这样的列,并将它们作为别名来定义日期,例如 Base_Date 或其他内容。
  2. 仍然不确定它应该是内部联接还是左联接。但由于您不希望查询的性质发生变化,因此 Inner 是有意义的,因为当前查询的行为类似于内部联接。这是因为如果一条记录存在于基础中但不在 trx_base 中,它将被 B.TRX_Date 评估消除,因为不会包含空值。

我们删除了什么以及为什么:

  1. 在 NR 上区分...由组处理它
  2. 1=1 这不会增加任何值,也不会更改数据。它总是真实的..
  3. 分组依据拼写出来。如果有人对代码进行更改,在第一两列中添加一列,这将会中断。
  4. 已删除 AS.. 它在 SQL 服务器中是可选的...
  5. 将左连接更改为内部连接,因为您对 B.TRX_Date 的限制将消除左连接生成的所有空值:因此这是一个内部连接,更改它不会影响结果。