【问题标题】:SQL query to find all transactions after the specific part repairSQL查询查找特定部分修复后的所有事务
【发布时间】:2017-10-08 08:29:07
【问题描述】:

我的数据与此示例类似,该示例非常庞大,因此理想情况下需要高效的代码。我想在充电器维修后仅查找那些进行过此维修的客户 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                        

通过使用它,我错过了一些与充电器维修日期在同一日期发生的交易,这可能是因为它是按维修日期排序的。我不妨忽略与充电器维修日期相同的所有交易以避免此问题。我也想根据大小进行限制。我在哪里可以包括它?请提出最有效的方法,因为我的桌子太大了。

【问题讨论】:

  • 您是否只需要 第一次 出现 CHARGER REPAIR 行之后的所有行?
  • 尝试先添加第二个排序列:ORDER BY REPAIR_DATE, CASE WHEN LABOR_CODE_DESC = 'CHARGER REPAIR' THEN 1 ELSE 0 END DESC

标签: sql teradata


【解决方案1】:

这在 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
                                       );

这让一切从充电器维修后的日期开始。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-01-21
    • 2021-11-08
    • 1970-01-01
    • 2016-12-29
    • 1970-01-01
    • 2012-09-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多