2013-02-15 38 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