【问题标题】:SQL query to find maximum of 3 transactions after the specific part repairSQL查询查找特定部分修复后最多3个事务
【发布时间】:2017-04-13 18:41:19
【问题描述】:

我的数据与此示例类似,该示例非常庞大,因此理想情况下需要高效的代码。我想在充电器维修后找到那些交易(最多 3 笔)。

TRANSACTION_ID  REPAIR_DATE CUSTOMER_ID    COMPONENT   LABOR_CODE_DESC ....
28289           6/25/2015   AH123        LAPTOP       CHARGER REPAIR
28235           6/29/2015    AH123       LAPTOP         CHIP REPLACE
258978         6/27/2013      HW687      PHONE      TOUCH SCREEN
28223           6/2/2014     AH123       LAPTOP      BATTERY REPAIR
215678          9/7/2014       HW687      PHONE         SIM REPAIR
527808          7/30/2016      HW687      LAPTOP         BATTERY REPAIR
567976          7/28/2014      HW687      LAPTOP         CHARGER REPAIR
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
215678          9/7/2014       HW687      PHONE     SIM REPAIR

.....

所以我想要的只是那些进行过充电器维修的客户 ID 交易,并且在充电器维修日期之后最多 3 次交易

SELECT TRANSACTION_ID, REPAIR_DATE,CUSTOMER_ID,LABOR_CODE_DESC from table 
where customer_id IN (SELECT CUSTOMER_ID from table where LABOR_CODE_DESC 
like '%CHARGER REPAIR%')

不知道如何在 CHARGER REPAIR 后扩展以获得最多 3 笔交易

【问题讨论】:

  • 只需在查询末尾添加限制 3
  • 用您正在使用的数据库标记您的问题。
  • 我正在使用 teradata

标签: sql teradata


【解决方案1】:

这将返回充电器维修日期之后的三行:

SELECT *
FROM tab
QUALIFY 
   -- check if any of the three previous rows contains 'CHARGER REPAIR'
   Max(CASE WHEN LABOR_CODE_DESC = 'CHARGER REPAIR' THEN 1 ELSE 0 END)
   Over (PARTITION BY CUSTOMER_ID
         ORDER BY REPAIR_DATE
         ROWS BETWEEN 3 Preceding AND 1 Preceding) = 1

编辑:

仅获取修复日期在未来 10 天内的行:

   -- check if any of the previous rows contains 'CHARGER REPAIR'
   -- and the current REPAIR_DATE is within 10 days after that repair
   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) >= REPAIR_DATE - 10

【讨论】:

  • 如果仅在“充电器维修”的 repair_date 10 天后才需要交易,我该如何添加。想过使用 + INTERVAL '10' day,但不确定如何以及在何处包含条件
  • :如果我在 CHARGER REPAIR 的同一天有多个交易。它们很少出现,也很少出现,因为我们根据 REPAIR_DATE 对它们进行排序。如何更改为在 CHARGER REPAIR 的同一天不显示任何交易以避免这种情况(可能会在 CHARGER REPAIR 日期之后添加一天)?
  • 如何克服充电器维修当天的多笔交易?我什至可能想消除与充电器维修在同一天发生的所有交易。是否可以通过稍微更改此代码来实现
【解决方案2】:

您可以通过以下方式获得所有此类交易:

select t.*
from table t
where t.repair_date > (select t2.repair_date
                       from table t2
                       where t2.customer_id = t.customer_id and
                             labor_code_desc like '%CHARGER REPAIR%'
                      );

将每个客户限制为 3 个有点棘手,但您可以使用窗口函数:

select t.*
from (select t.*,
             row_number() over (partition by customer_id order by repair_date) as seqnum
      from (select t.*,
                   max(case when labor_code_desc like '%CHARGER REPAIR%' then repair_date end) over (partition by customer_id) as max_crd
            from table t
           ) t
      where t.repair_date > max_crd
     ) t
where seqnum <= 3;

【讨论】:

  • 作为单个语句执行。失败 [3707 : 42000] 语法错误,在单词 'repair_date' 和'。经过的时间 = 00:00:00.020 声明 1:未知失败。
  • @viji 。 . .我认为这是第二个查询。我没有完成where 子句。
  • 现在出现此错误 - 作为单个语句执行。失败 [5479 : HY000] WHERE 子句中不允许使用有序分析函数。经过的时间 = 00:00:00.026 语句 1:选择语句失败。
  • @viji 。 . . where 子句中没有有序的分析函数。但是,在 Teradata 中,您可以将它们放入 qualify 子句中。
猜你喜欢
  • 2017-10-08
  • 2021-11-08
  • 1970-01-01
  • 1970-01-01
  • 2012-11-30
  • 2016-12-29
  • 1970-01-01
  • 1970-01-01
  • 2011-05-20
相关资源
最近更新 更多