1

次のスキーマを持つテーブルを検討してください。

id, location, starred

同じ場所に多くのレコードがあります:

id | location | starred
-----------------------
1     rome      yes
2     rome      no
3     rome      no
4     milan     yes
5     milan     no
6     bozen     no

場所ごとに最大で 1 つのレコードが必要です。そして、スター付きのレコードとスターなしのレコードのどちらかを選択する場合、スター付きのレコードが必要です。したがって、このテーブルを生成するSQLは次のとおりです。

id | location | starred
-----------------------
1     rome      yes
4     milan     yes
6     bozen     no

これは、いくつかの仮想テーブルまたは「ビュー」で実行できると思います。

DELETE FROM table
GROUP BY location, 
4

4 に答える 4

3

分析関数を使用して重複を削除します。次のコードは、row_numberベースの場所を生成し、スター付きの説明で並べ替えます(したがって、yesが最初に来ます)

 delete from mytable2 where id in ( 
select id from
( select  id, location,starred,row_number() over ( partition by location order by location, starred desc) row_num 
  from mytable2
) where row_num >1
)
于 2012-06-27T16:18:09.147 に答える
1

[started] が yes または no しかない場合、これは機能するはずです。

create table data
(
id int identity(1,1),
location varchar(50),
[started] varchar(3)
)

insert into data select 'Rome', 'Yes'
insert into data select 'Rome', 'No'
insert into data select 'Rome', 'No'
insert into data select 'Milan', 'Yes'
insert into data select 'Milan', 'No'
insert into data select 'Bozen', 'No'

WITH locationsRanked (id, location, [started], rank)
AS
(
    select min(Id), location, [started],
    RANK() OVER (PARTITION BY location  ORDER BY location, [started] DESC) AS Rank
    from data
    group by location, [started]
)
select * from locationsRanked where Rank = 1
order by id
于 2012-06-27T16:18:31.957 に答える
0

データを抽出したいだけの場合は、次のように機能するはずです。

select
    [table].*
from
    [table]
    inner join (select 
                    MIN(id) as id, 
                    location 
                from 
                    [table] 
                group by location) as data
        on [table].id = data.id

明らかに、これ (または同様のクエリ) の結果を使用して、削除する ID のリストを決定することもできます。

于 2012-06-27T16:06:04.863 に答える
-1

これはあなたを助けることができると思います:

http://www.w3schools.com/sql/sql_distinct.asp

于 2012-06-27T15:57:40.483 に答える