sql >> データベース >  >> RDS >> Sqlserver

SQL での無効な重複行の削除

    これを試してください:

     ;WITH users_CTE as (
     select rank() over (partition by Username order by Checktime) as rnk from users
     )
    
     DELETE FROM users_CTE where rnk <> 1
    

    -- 2 番目の要件については、このクエリを試してください

     ;WITH users_CTE as (
     select *,rank() over (partition by Username order by Checktime) as rnk from users
     )
    ,CTE2 as (select Username,MIN(CheckTime) as minTime,DATEADD(mi,1,MIN(CheckTime)) as maxTime from users_CTE 
     group by Username)
    
    
    
    delete from users where Checktime in(
    select c1.Checktime from users_CTE c1 left join CTE2 c2
    on c1.Checktime > c2.minTime and c1.Checktime <= c2.maxTime
    where c2.Username is not null and c1.Username in(
    
    select c1.Username from users_CTE c1 left join CTE2 c2
    on c1.Checktime > c2.minTime and c1.Checktime <= c2.maxTime
    group by c1.Username,c2.Username 
    having COUNT(*) > 1))
    

    -- 変更された要件については、以下のクエリを確認してください

    alter table users add flag varchar(2)
    
    ;WITH users_CTE as (
     select *,rank() over (partition by Username order by Checktime) as rnk from users
     )
    ,CTE2 as (select Username,MIN(CheckTime) as minTime,DATEADD(mi,1,MIN(CheckTime)) as maxTime from users_CTE 
     group by Username)
    
    
    update u SET u.flag = 'd' from users_CTE u inner join (
    select c1.Checktime from users_CTE c1 left join CTE2 c2
    on c1.Checktime > c2.minTime and c1.Checktime <= c2.maxTime
    where c2.Username is not null and c1.Username in(
    
    select c1.Username from users_CTE c1 left join CTE2 c2
    on c1.Checktime > c2.minTime and c1.Checktime <= c2.maxTime
    group by c1.Username,c2.Username 
    having COUNT(*) > 1)) a
    on u.Checktime=a.Checktime
    

    --DeletFlagで最新のクエリを確認

    ;WITH users_CTE as 
    (
     select *,row_number() over (partition by Username order by Checktime) as row from users
    )
    ,CTE as(
    select row,Username,Checktime,CheckType,0 as totalSeconds,'N' as Delflag from users_CTE where row=1 
    union all
    select t.row,t.Username,t.Checktime,t.CheckType,CASE WHEN (c.totalSeconds + DATEDIFF(SECOND,c.Checktime,t.Checktime))  >= 60 then 0 else (c.totalSeconds + DATEDIFF(SECOND,c.Checktime,t.Checktime)) end as totalSeconds,
    CASE WHEN (c.totalSeconds + DATEDIFF(SECOND,c.Checktime,t.Checktime))  >= 60 then 'N' else 'Y' end as Delflag
    --CASE WHEN c.totalSeconds <= 60  then 'Y' else 'N' end as Delflag
    from users_CTE t inner join CTE c
    on t.row=c.row+1
    )
    
    select Username,Checktime,CheckType,Delflag from CTE
    


    1. SSRSで改ページを与える方法

    2. 配列要素にアクセスする方法

    3. MySQL/MariaDBテーブルの現在のAuto_Incrementシーケンス番号を取得する方法

    4. SQL Server(T-SQL)のデータベースメールアカウントのリストを取得する