0

この場合の MAX() の使用方法を見つけようとしています。このクエリの結果、重複があり、最新のレコード (ここでは日付: CL.CL_DATE_FROM) を 1 つだけ見つけて、db1.IDF と O.IDp で重複排除したいと考えています。

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'
4

2 に答える 2

1

max(CL_DATE_FROM)for eachを返す次のようなものを使用できるはずです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
于 2013-03-05T15:45:35.373 に答える
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()レコードのグループに連番を割り当てるウィンドウ関数です。この場合、グループは 2 つの ID によって定義されます。順序付けは、最新のものに 1 が割り当てられるようになっています。

ちなみに、このようなクエリの重複は、おそらく結合が原因です。複数の行に対して異なる結合が行われ、結果は値のデカルト積になります。また、調査して重複の原因を見つけ、そこで問題を修正することもできます。

于 2013-03-05T15:51:57.130 に答える