我遇到如下情况:
我有两个数据库表。第一个表格,我称之为TB1,包含客户认可的所有工资。也是交易发生的日期。 第二个表格,我称之为TB2,包含客户在银行中的所有产品。 我的目的是找到客户在我们银行获得产品之前获得的工资数量(在我的情况下是OVERDRAFT)。 到目前为止,一切正常,我已经进行了查询以提取必要的数据。 唯一的问题是,我需要改进查询。因此,如果某个客户在同一年的同一个月内获得了超过1个工资(例如每15天),那么工资只计算一次。 我该怎么办?
查询如下:
SELECT TB1.customer_id, COUNT(TB1.customer_id)
FROM table_1 TB1
JOIN
( SELECT TB2.CUSTOMER_ID, TB2.OD_START_DATE
FROM table_2 TB2
JOIN table_2 TB2_MAX
ON TB2.CUSTOMER_ID = TB2_MAX.CUSTOMER_ID
HAVING TB2.od_start_date = MAX(TB2.od_start_date)
GROUP BY TB2.customer_id, TB2.od_start_date
) TB2
ON TB1.CUSTOMER_ID = TB2.CUSTOMER_ID
WHERE TB1.DATE_FROM < TB2.OD_START_DATE
GROUP BY TB1.CUSTOMER_ID
PS:DATE_FROM字段包含交易日期,而OD_START_DATE字段包含LATEST产品开启日期。
答案 0 :(得分:1)
内部查询中的JOIN是多余的。您只需为每位客户提供最大日期。 在外部查询中,您应该计算DATE_FROM,而不是Customer_Id。由于您只想对一个月内的交易计算一次,因此将DATE_FROM转换为年月组合,并使用DISTINCT仅计算一次。
SELECT TB1.customer_id, COUNT(DISTINCT TO_CHAR(TB1.DATE_FROM,'YYYYMM'))
FROM table_1 TB1
JOIN
( SELECT CUSTOMER_ID, MAX(OD_START_DATE) AS OD_START_DATE
FROM table_2
GROUP BY customer_id
) TB2
ON TB1.CUSTOMER_ID = TB2.CUSTOMER_ID
WHERE TB1.DATE_FROM < TB2.OD_START_DATE
GROUP BY TB1.CUSTOMER_ID