SQL 查询查找特定零件维修后的所有交易
SQL query to find all transactions after the specific part repair
我的数据与这个非常庞大的示例类似,因此理想情况下需要高效的代码。我只想在充电器维修后为那些进行过此维修的客户 ID 查找这些交易。
TRANSACTION_ID REPAIR_DATE CUSTOMER_ID COMPONENT LABOR_CODE_DESC Size....
28289 6/25/2015 AH123 LAPTOP CHARGER REPAIR big
28235 6/29/2015 AH123 LAPTOP CHIP REPLACE small
258978 6/27/2013 HW687 PHONE TOUCH SCREEN
28223 6/2/2014 AH123 LAPTOP BATTERY REPAIR
215678 7/28/2014 HW687 PHONE SIM REPAIR
527808 7/30/2016 HW687 LAPTOP BATTERY REPAIR
567976 7/28/2014 HW687 LAPTOP CHARGER REPAIR big
7678698 8/68/2015 AH123 LAPTOP BATTERY REPAIR
9987908 5/7/2006 TU890 PHONE SIM REPAIR
.....
OUTPUT
TRANSACTION_ID REPAIR_DATE CUSTOMER_ID COMPONENT LABOR_CODE_DESC ....
28235 6/29/2015 AH123 LAPTOP CHIP REPLACE
7678698 8/68/2015 AH123 LAPTOP BATTERY REPAIR
527808 7/30/2016 HW687 LAPTOP BATTERY REPAIR
.....
dont need:
215678 9/7/2014 HW687 PHONE SIM REPAIR
因为这与充电器维修日期相同。我尝试了以下代码
SELECT *
FROM tab
QUALIFY
Max(CASE WHEN LABOR_CODE_DESC = 'CHARGER REPAIR' THEN 1 ELSE 0 END)
Over (PARTITION BY CUSTOMER_ID
ORDER BY REPAIR_DATE
ROWS BETWEEN Unbounded Preceding AND 1 Preceding) >= 1
通过使用此功能,我遗漏了一些与充电器维修日期同一天发生的交易,这可能是因为它是按维修日期排序的。我不妨忽略与充电器维修日期相同的所有交易以避免此问题。我也想根据大小进行限制。我可以在哪里包括它?请提出最有效的方法,因为我的 table 太大了。
这在 Teradata 中有效吗?
SELECT *
FROM tab
QUALIFY REPAIR_DATE > Max(CASE WHEN LABOR_CODE_DESC = 'CHARGER REPAIR' THEN REPAIR_DATE
END) Over (PARTITION BY CUSTOMER_ID
ORDER BY REPAIR_DATE
ROWS BETWEEN Unbounded Preceding AND 1 Preceding
);
这将使一切从充电器维修后的日期开始。
我的数据与这个非常庞大的示例类似,因此理想情况下需要高效的代码。我只想在充电器维修后为那些进行过此维修的客户 ID 查找这些交易。
TRANSACTION_ID REPAIR_DATE CUSTOMER_ID COMPONENT LABOR_CODE_DESC Size....
28289 6/25/2015 AH123 LAPTOP CHARGER REPAIR big
28235 6/29/2015 AH123 LAPTOP CHIP REPLACE small
258978 6/27/2013 HW687 PHONE TOUCH SCREEN
28223 6/2/2014 AH123 LAPTOP BATTERY REPAIR
215678 7/28/2014 HW687 PHONE SIM REPAIR
527808 7/30/2016 HW687 LAPTOP BATTERY REPAIR
567976 7/28/2014 HW687 LAPTOP CHARGER REPAIR big
7678698 8/68/2015 AH123 LAPTOP BATTERY REPAIR
9987908 5/7/2006 TU890 PHONE SIM REPAIR
.....
OUTPUT
TRANSACTION_ID REPAIR_DATE CUSTOMER_ID COMPONENT LABOR_CODE_DESC ....
28235 6/29/2015 AH123 LAPTOP CHIP REPLACE
7678698 8/68/2015 AH123 LAPTOP BATTERY REPAIR
527808 7/30/2016 HW687 LAPTOP BATTERY REPAIR
.....
dont need:
215678 9/7/2014 HW687 PHONE SIM REPAIR
因为这与充电器维修日期相同。我尝试了以下代码
SELECT *
FROM tab
QUALIFY
Max(CASE WHEN LABOR_CODE_DESC = 'CHARGER REPAIR' THEN 1 ELSE 0 END)
Over (PARTITION BY CUSTOMER_ID
ORDER BY REPAIR_DATE
ROWS BETWEEN Unbounded Preceding AND 1 Preceding) >= 1
通过使用此功能,我遗漏了一些与充电器维修日期同一天发生的交易,这可能是因为它是按维修日期排序的。我不妨忽略与充电器维修日期相同的所有交易以避免此问题。我也想根据大小进行限制。我可以在哪里包括它?请提出最有效的方法,因为我的 table 太大了。
这在 Teradata 中有效吗?
SELECT *
FROM tab
QUALIFY REPAIR_DATE > Max(CASE WHEN LABOR_CODE_DESC = 'CHARGER REPAIR' THEN REPAIR_DATE
END) Over (PARTITION BY CUSTOMER_ID
ORDER BY REPAIR_DATE
ROWS BETWEEN Unbounded Preceding AND 1 Preceding
);
这将使一切从充电器维修后的日期开始。