2013-03-05 41 views
0

我试图找出如何在这种情况下使用MAX()。 在此查询的结果中,我有重复项,我只想找到一个最新记录(这里是日期:CL.CL_DATE_FROM),并通过db1.IDF和O.IDp对其进行重复数据删除。SQL查询 - 最大和重复

SELECT 
    db1.IDF as IDF, 
    O.IDp as IDP, 
    O.Action as Action, 
    U.USR_IDENT as Operator, 
    O.ID_T as ID_T, 
    OC.OC_MEMO as MEMO, 
    CONVERT(VARCHAR(10),CL.CL_DATE_FROM,120) as date, 
    CONVERT(VARCHAR(8),CL.CL_DATE_FROM,108) as time 
from OUTBOUND OC 
    join CALL CL on CL.CL_ID= OC.OC_CL_ID 
    join CAMPAIGN CA on CA.CA_ID = OC.OC_CA_ID 
    join STATUSES ATT on ATT.AS_ID = OC.OC_AS_ID 
    join USERS U on U.USR_ID = OC.OC_USR_ID 
    join Outbound_Z O on O.ID = OC.OC_CUS_ID 
    join db1.dbo.Clients db1 on db1.ID_T = O.ID_T 
where CL.CL_DATE_FROM BETWEEN '2013-03-05 00:00:00.000' AND '2013-03-05 23:59:59.000' 

回答

0

我会用row_number()此:

with t as (
    SELECT db1.IDF as IDF, O.IDp as IDP, O.Action as Action, U.USR_IDENT as Operator, 
      O.ID_T as ID_T, OC.OC_MEMO as MEMO, CONVERT(VARCHAR(10),CL.CL_DATE_FROM,120) as date, 
      CONVERT(VARCHAR(8),CL.CL_DATE_FROM,108) as time, 
      ROW_NUMBER() over (partition by db1.idf, o.idp order by cl.cl_date_from desc) as seqnum 
    from OUTBOUND OC 
     join CALL CL on CL.CL_ID= OC.OC_CL_ID 
     join CAMPAIGN CA on CA.CA_ID = OC.OC_CA_ID 
     join STATUSES ATT on ATT.AS_ID = OC.OC_AS_ID 
     join USERS U on U.USR_ID = OC.OC_USR_ID 
     join Outbound_Z O on O.ID = OC.OC_CUS_ID 
     join db1.dbo.Clients db1 on db1.ID_T = O.ID_T 
    where CL.CL_DATE_FROM BETWEEN '2013-03-05 00:00:00.000' AND '2013-03-05 23:59:59.000' 
    ) 
select * 
from t 
where seqnum = 1 

row_number()是窗口函数,它为一组记录分配一个连续编号。在这种情况下,这些组由两个ID定义。排序是如此最近得到分配1.

顺便说一句,像这样的查询重复可能是由连接引起的。不同的连接是多行,结果是值的笛卡尔积。您也可以调查以找出重复的原因并解决问题。

1

你应该能够使用类似这样的东西,将返回max(CL_DATE_FROM)每个CL_ID

SELECT 
    db1.IDF as IDF, 
    O.IDp as IDP, 
    O.Action as Action, 
    U.USR_IDENT as Operator, 
    O.ID_T as ID_T, 
    OC.OC_MEMO as MEMO, 
    CONVERT(VARCHAR(10),CL.MaxDate,120) as date, 
    CONVERT(VARCHAR(8),CL.MaxDate,108) as time 
from OUTBOUND OC 
join 
(
    select max(CL_DATE_FROM) MaxDate, 
     CL_ID 
    from CALL 
    where CL_DATE_FROM BETWEEN '2013-03-05 00:00:00.000' AND '2013-03-05 23:59:59.000' 
    group by CL_ID 
) CL 
    on CL.CL_ID= OC.OC_CL_ID 
join CAMPAIGN CA 
    on CA.CA_ID = OC.OC_CA_ID 
join STATUSES ATT 
    on ATT.AS_ID = OC.OC_AS_ID 
join USERS U 
    on U.USR_ID = OC.OC_USR_ID 
join Outbound_Z O 
    on O.ID = OC.OC_CUS_ID 
join db1.dbo.Clients db1 
    on db1.ID_T = O.ID_T