2013-02-15 47 views
1

我有一个表命名为计算机,看起来像这样:删除表中的行,并计算

DomainPrefixedComputername | LastStartUpDate 
OLDDOMAIN\Computer1  |2012-01-25 
OLDDOMAIN\Computer2  |2012-02-20 
OLDDOMAIN\Computer3  |2012-03-03 
OLDDOMAIN\Computer4  |2012-04-15 
OLDDOMAIN\Computer5  |2012-12-18 
\Computer1     |2012-01-27 (computer was inserted when it had no domain affinity) 
NEWDOMAIN\Computer1  |2012-02-01 
NEWDOMAIN\Computer2  |2012-02-22 
NEWDOMAIN\Computer3  |2012-03-23 

的方法,无论是插入新DomainPrefixedComputers或现有的更新。更改进程或数据库是不可能的。

我想要做的是删除包含具有最旧的LastStartUpDate的计算机的行,如果在其他域中有匹配的计算机。由于计算机可能被放回到旧域中,仅删除以OLDDOMAIN为前缀的行是不够的。我也不想删除有利于非前缀计算机的行。

下面的语句让我的非前缀计算机的列表,以及有多少地方找到:

SELECT 
Replace(
Replace(
Replace(DomainPrefixedComputername, 'NEWDOMAIN\', '') 
, 'OLDDOMAIN\', '') 
, '\', '') AS TempDomainPrefixedComputername 
, Count(DomainPrefixedComputername) AS _count_ 
FROM Computers 
GROUP BY 
Replace(
Replace(
Replace(DomainPrefixedComputername, 'NEWDOMAIN\', '') 
, 'OLDDOMAIN\', '') 
, '\', '') 

产量:

TempDomainPrefixedComputername | _count_ 
Computer1      | 3 
Computer2      | 2 
Computer3      | 2 
Computer4      | 1 
Computer5      | 1 

这是我会怎样表达我的需要:

删除最旧的LastStartUpDate行如果有其他电脑存在 同名AND ot她的电脑的前缀是 OLDDOMAIN \或NEWDOMAIN \。

我的问题是:我怎样才能完成我想要的?

回答

1

试试这个:(在我的例子列名DomainPrefixedComputername> DOM,LastStartUpDate> DT)Here is SQL-Fiddle-Demo

;with cte as (
    select dom,dt, 
    case when charindex('\',dom,1)=1 then 0 else 1 end hasDom, 
    row_number() over (partition by 
        substring(dom,charindex('\',dom,1)+1,len(dom)) 
        order by dt desc) rn     
    from T 
) 
delete from cte where rn<>1 and hasDom = 1 


--Select * results after deleting 
|     DOM |   DT | 
------------------------------------ 
| OLDDOMAIN\Computer4 | 2012-04-15 | 
| OLDDOMAIN\Computer5 | 2012-12-18 | 
|   \Computer1 | 2012-01-27 | 
| NEWDOMAIN\Computer1 | 2012-02-01 | 
| NEWDOMAIN\Computer2 | 2012-02-22 | 
| NEWDOMAIN\Computer3 | 2012-03-23 | 
+0

完美地回答我的问题!非常感谢! – Daro 2013-02-15 09:58:49

+0

没问题,乐意帮忙... – Kaf 2013-02-15 10:00:22