0

約100件の重複(約4万件のレコードのうち)を回避するために使用しているサブクエリで髪の毛を抜いています。正当な理由でh2.datecreatedに2つの日付があるため、複製されたレコードが表示されているため、データをスクラブするだけでは不十分です。

一番早い日付だけを返そうとしています。最初のサブクエリ(「selectdistinct address_id」で始まり、MINが付いている)はそれ自体で正常に機能します...重複は返されません。したがって、左の結合(または単純な結合...私も試しました)は、サブクエリに表示されないため、2番目のh2.datecreatedを表示できない可能性があります。しかし、クエリ全体を実行すると、一部のipc.mfgidに対して2つの値が返されます。1つは必要なh2.datecreatedを使用し、もう1つは不要な値を返します。

私はそれが本当に単純なもの、または単に不可能なものでなければならないことを知っています。本当にうまくいくようです!これはMSSQLです。ありがとう!

select distinct ipc.mfgid as IPC, h2.datecreated,
case when ad.Address is null
then ad.buildingname end as Address, cast(trace.name as varchar) 
    + '-' + cast(trace.Number       as varchar) as ONT, 
 c.ACCOUNT_Id,
case when h.datecreated is not null then h.datecreated
     else  h2.datecreated end as Install
from equipmentjoin as ipc
left join historyjoin as h on ipc.id = h.EQUIPMENT_Id 
   and h.type like 'add'
left join circuitjoin as c on ipc.ADDRESS_Id = c.ADDRESS_Id 
           and c.GRADE_Code like '%hpna%'
join (select distinct address_id, equipment_id,  
     min(datecreated) as datecreated, comment
     from history where comment like 'MAC: 5%' group by equipment_id, address_id, comment)
          as h2 on c.address_id = h2.address_id
left join (select car.id, infport.name, carport.number, car.PCIRCUITGROUP_Id
     from circuit as car (NOLOCK)  
     join port as carport (NOLOCK) on car.id = carport.CIRCUIT_Id
      and carport.name like 'lead%'
      and car.GRADE_Id = 29 
     join circuit as inf (NOLOCK) on car.CCIRCUITGROUP_Id = inf.PCIRCUITGROUP_Id
     join port as infport (NOLOCK) on inf.id = infport.CIRCUIT_Id
     and infport.name like '%olt%' )
 as trace on c.ccircuitgroup_id = trace.pcircuitgroup_id
join addressjoin as ad (NOLOCK) on ipc.address_id = ad.id
4

2 に答える 2

1

最下位の行のみを取得するための一般的なアプローチは、次のいずれかです。使用しているSQLServerのバージョン、タイで何をしたいのかをわざわざ指定する必要はありませんでした。これを複雑なクエリに組み込むことにはほとんど関心がないので、異なるバージョン。

SQL Server 2000

SELECT x.grouping_column, x.min_column, x.other_columns ...
FROM dbo.foo AS x
INNER JOIN
(
  SELECT grouping_column, min_column = MIN(min_column)
  FROM dbo.foo GROUP BY grouping_column
) AS y  
ON x.grouping_column = y.grouping_column
AND x.min_column = y.min_column;

SQL Server 2005+

;WITH x AS
(
   SELECT grouping_column, min_column, other_columns,
     rn = ROW_NUMBER() OVER (ORDER BY min_column)
   FROM dbo.foo
)
SELECT grouping_column, min_column, other_columns
FROM x
WHERE rn = 1;
于 2012-07-05T21:08:41.337 に答える
0

このサブクエリ:

select distinct address_id, equipment_id,  
 min(datecreated) as datecreated, comment
 from history where comment like 'MAC: 5%' group by equipment_id, address_id, comment

コメントが同じであることが保証されていないため、おそらく複数の行が返されます。

代わりにこれを試してください:

CROSS APPLY (
   SELECT TOP 1 H2.DateCreated, H2.Comment -- H2.Equipment_id wasn't used
   FROM History H2
   WHERE
      H2.Comment LIKE 'MAC: 5%'
      AND C.Address_ID = H2.Address_ID
   ORDER BY DateCreated
) H2

OUTER APPLY一致する目的の履歴エントリがない行が必要な場合は、これをに切り替えます。

于 2012-07-05T22:50:58.370 に答える