0

我正在使用一个子查询来避免大约 100 个重复项(在大约 40k 条记录中)。显示重复的记录是因为它们在 h2.datecreated 中有 2 个日期是有正当理由的,所以我不能只清理数据。

我试图只得到最早的返回日期。第一个子查询(以“select distinct address_id”开头,带有 MIN)可以自己正常工作……不返回重复项。所以看起来左连接(或者只是简单的连接......我也试过了)不可能看到第二个 h2.datecreated,因为它甚至没有出现在子查询中。但是当我运行整个查询时,它会返回一些 ipc.mfgid 的 2 个值,一个是我想要的 h2.datecreated,另一个是我不想要的。

我知道这一定是非常简单的事情,或者是不可能的事情。看起来它真的应该工作!这是 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

仅获取最低行的典型方法是以下之一。您没有费心指定您使用的是什么版本的 SQL Server,您想对关系做什么,我没有兴趣尝试将其应用于您的复杂查询,因此我将向您展示一个抽象的简化不同的版本。

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 回答