2017-04-05 47 views
1

我的数据与此示例非常相似,因此非常大,因此idealy需要高效的代码。我想在充电器修理后找到这些交易(最多3个)。SQL查询可在特定部件修复后查找最多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的交易已经过充电修复和充电器维修日期

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%') 

不知道我该怎么扩大,以获得最大的3后最多3个交易充电修复后交易

+0

只需在t处添加限制3他结束您的查询 –

+0

用您正在使用的数据库标记您的问题。 –

+0

我正在使用teradata – viji

回答

2

这是一个充电修复日期后返回三行:

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 
+0

如果我只需要在'Charger Repair'的repair_date 10天后才需要交易,我该如何添加。想法使用+ INTERVAL'10'日,但不知道如何以及在哪里包括条件 – viji

+0

@viji:请参阅我的编辑 – dnoeth

+0

:如果我在CHARGER REPAIR的同一天有多个交易。根据REPAIR_DATE,我们几乎没有出现,也没有出现,因为我们正在订购它们。如何更改为不在CHARGER REPAIR的同一天显示任何交易以避免此情况(可能会在CHARGER REPAIR日期之后添加一天)? – viji

-1

您可以通过执行获得所有此类交易:

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%的客户是小tricker,但您可以使用窗口函数:

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; 
+0

以单一语句执行。失败[3707:42000]语法错误,预期类似于'repair_date'和''之间的'SUCCEEDS'关键字或'MEETS'关键字或'PRECEDES'关键字或'IN'关键字或'CONTAINS'关键字”。 已用时间= 00:00:00.020 声明1:未知失败。 – viji

+0

@viji。 。 。我假设这是为第二个查询。我没有完成'where'条款。 –

+0

现在收到此错误 - 作为单个语句执行。失败[5479:HY000]在WHERE子句中不允许排序分析函数。 已用时间= 00:00:00.026 声明1:选择语句失败。 – viji