質問
住宅リストの表があります。都市ごとに最大10件のリスティングを保持したいと思います。 (ほとんどの都市のリストは10個未満です)。
このクエリを実行するとき:
select city, count(city) as cityCount from tREaltyTrac group by city
SQLは以下を返します:
Acampo 1
Acton 1
Adelanto 20
Agua Dulce 1
Aguanga 1
Akron 19
Albany 12
Albion 3
Alexandria 14
Algonac 1
Alhambra 5
したがって、Adelanto、Akron、Albany、およびAlexandriaは、「作成」と呼ばれる最新の日時フィールドによって順序付けられた10個のリストに削減する必要があります(作成順による順序付け)。
記載されているようにリスティングを元に戻す手順を誰でも考えられますか?
解決
ループしないでください!
ステータスで行をマークすることを好みますが、これはあなたが望むようにそれらを削除します...
これを試してください(SQLサーバー)
テーブルのセットアップ
create table tREaltyTrac (city varchar(20),creation datetime)
insert into tREaltyTrac values ('Acampo' ,getdate()) --1
waitfor delay '00:00:01'
insert into tREaltyTrac values ('Acton' ,getdate()) --1
waitfor delay '00:00:01'
insert into tREaltyTrac values ('Adelanto' ,getdate()) --20
waitfor delay '00:00:01'
insert into tREaltyTrac values ('Adelanto' ,getdate()) --20
waitfor delay '00:00:01'
insert into tREaltyTrac values ('Adelanto' ,getdate()) --20
waitfor delay '00:00:01'
insert into tREaltyTrac values ('Adelanto' ,getdate()) --20
waitfor delay '00:00:01'
insert into tREaltyTrac values ('Adelanto' ,getdate()) --20
waitfor delay '00:00:01'
insert into tREaltyTrac values ('Adelanto' ,getdate()) --20
waitfor delay '00:00:01'
insert into tREaltyTrac values ('Adelanto' ,getdate()) --20
waitfor delay '00:00:01'
insert into tREaltyTrac values ('Adelanto' ,getdate()) --20
waitfor delay '00:00:01'
insert into tREaltyTrac values ('Adelanto' ,getdate()) --20
waitfor delay '00:00:01'
insert into tREaltyTrac values ('Adelanto' ,getdate()) --20
waitfor delay '00:00:01'
insert into tREaltyTrac values ('Adelanto' ,getdate()) --20
waitfor delay '00:00:01'
insert into tREaltyTrac values ('Adelanto' ,getdate()) --20
waitfor delay '00:00:01'
insert into tREaltyTrac values ('Adelanto' ,getdate()) --20
waitfor delay '00:00:01'
insert into tREaltyTrac values ('Adelanto' ,getdate()) --20
waitfor delay '00:00:01'
insert into tREaltyTrac values ('Adelanto' ,getdate()) --20
waitfor delay '00:00:01'
insert into tREaltyTrac values ('Adelanto' ,getdate()) --20
waitfor delay '00:00:01'
insert into tREaltyTrac values ('Adelanto' ,getdate()) --20
waitfor delay '00:00:01'
insert into tREaltyTrac values ('Adelanto' ,getdate()) --20
waitfor delay '00:00:01'
insert into tREaltyTrac values ('Adelanto' ,getdate()) --20
waitfor delay '00:00:01'
insert into tREaltyTrac values ('Adelanto' ,getdate()) --20
waitfor delay '00:00:01'
insert into tREaltyTrac values ('Agua Dulce' ,getdate()) --1
waitfor delay '00:00:01'
insert into tREaltyTrac values ('Aguanga' ,getdate()) --1
waitfor delay '00:00:01'
insert into tREaltyTrac values ('Akron' ,getdate()) --19
waitfor delay '00:00:01'
insert into tREaltyTrac values ('Akron' ,getdate()) --19
waitfor delay '00:00:01'
insert into tREaltyTrac values ('Akron' ,getdate()) --19
waitfor delay '00:00:01'
insert into tREaltyTrac values ('Akron' ,getdate()) --19
waitfor delay '00:00:01'
insert into tREaltyTrac values ('Akron' ,getdate()) --19
waitfor delay '00:00:01'
insert into tREaltyTrac values ('Akron' ,getdate()) --19
waitfor delay '00:00:01'
insert into tREaltyTrac values ('Akron' ,getdate()) --19
waitfor delay '00:00:01'
insert into tREaltyTrac values ('Akron' ,getdate()) --19
waitfor delay '00:00:01'
insert into tREaltyTrac values ('Akron' ,getdate()) --19
waitfor delay '00:00:01'
insert into tREaltyTrac values ('Akron' ,getdate()) --19
waitfor delay '00:00:01'
insert into tREaltyTrac values ('Akron' ,getdate()) --19
waitfor delay '00:00:01'
insert into tREaltyTrac values ('Akron' ,getdate()) --19
waitfor delay '00:00:01'
insert into tREaltyTrac values ('Akron' ,getdate()) --19
waitfor delay '00:00:01'
insert into tREaltyTrac values ('Akron' ,getdate()) --19
waitfor delay '00:00:01'
insert into tREaltyTrac values ('Akron' ,getdate()) --19
waitfor delay '00:00:01'
insert into tREaltyTrac values ('Akron' ,getdate()) --19
waitfor delay '00:00:01'
insert into tREaltyTrac values ('Akron' ,getdate()) --19
waitfor delay '00:00:01'
insert into tREaltyTrac values ('Akron' ,getdate()) --19
waitfor delay '00:00:01'
insert into tREaltyTrac values ('Akron' ,getdate()) --19
waitfor delay '00:00:01'
insert into tREaltyTrac values ('Albany' ,getdate()) --12
waitfor delay '00:00:01'
insert into tREaltyTrac values ('Albany' ,getdate()) --12
waitfor delay '00:00:01'
insert into tREaltyTrac values ('Albany' ,getdate()) --12
waitfor delay '00:00:01'
insert into tREaltyTrac values ('Albany' ,getdate()) --12
waitfor delay '00:00:01'
insert into tREaltyTrac values ('Albany' ,getdate()) --12
waitfor delay '00:00:01'
insert into tREaltyTrac values ('Albany' ,getdate()) --12
waitfor delay '00:00:01'
insert into tREaltyTrac values ('Albany' ,getdate()) --12
waitfor delay '00:00:01'
insert into tREaltyTrac values ('Albany' ,getdate()) --12
waitfor delay '00:00:01'
insert into tREaltyTrac values ('Albany' ,getdate()) --12
waitfor delay '00:00:01'
insert into tREaltyTrac values ('Albany' ,getdate()) --12
waitfor delay '00:00:01'
insert into tREaltyTrac values ('Albany' ,getdate()) --12
waitfor delay '00:00:01'
insert into tREaltyTrac values ('Albany' ,getdate()) --12
waitfor delay '00:00:01'
insert into tREaltyTrac values ('Albion' ,getdate()) --3
waitfor delay '00:00:01'
insert into tREaltyTrac values ('Albion' ,getdate()) --3
waitfor delay '00:00:01'
insert into tREaltyTrac values ('Albion' ,getdate()) --3
waitfor delay '00:00:01'
insert into tREaltyTrac values ('Alexandria' ,getdate()) --14
waitfor delay '00:00:01'
insert into tREaltyTrac values ('Alexandria' ,getdate()) --14
waitfor delay '00:00:01'
insert into tREaltyTrac values ('Alexandria' ,getdate()) --14
waitfor delay '00:00:01'
insert into tREaltyTrac values ('Alexandria' ,getdate()) --14
waitfor delay '00:00:01'
insert into tREaltyTrac values ('Alexandria' ,getdate()) --14
waitfor delay '00:00:01'
insert into tREaltyTrac values ('Alexandria' ,getdate()) --14
waitfor delay '00:00:01'
insert into tREaltyTrac values ('Alexandria' ,getdate()) --14
waitfor delay '00:00:01'
insert into tREaltyTrac values ('Alexandria' ,getdate()) --14
waitfor delay '00:00:01'
insert into tREaltyTrac values ('Alexandria' ,getdate()) --14
waitfor delay '00:00:01'
insert into tREaltyTrac values ('Alexandria' ,getdate()) --14
waitfor delay '00:00:01'
insert into tREaltyTrac values ('Alexandria' ,getdate()) --14
waitfor delay '00:00:01'
insert into tREaltyTrac values ('Alexandria' ,getdate()) --14
waitfor delay '00:00:01'
insert into tREaltyTrac values ('Alexandria' ,getdate()) --14
waitfor delay '00:00:01'
insert into tREaltyTrac values ('Alexandria' ,getdate()) --14
waitfor delay '00:00:01'
insert into tREaltyTrac values ('Algonac' ,getdate()) --1
waitfor delay '00:00:01'
insert into tREaltyTrac values ('Alhambra' ,getdate()) --5
waitfor delay '00:00:01'
insert into tREaltyTrac values ('Alhambra' ,getdate()) --5
waitfor delay '00:00:01'
insert into tREaltyTrac values ('Alhambra' ,getdate()) --5
waitfor delay '00:00:01'
insert into tREaltyTrac values ('Alhambra' ,getdate()) --5
waitfor delay '00:00:01'
insert into tREaltyTrac values ('Alhambra' ,getdate()) --5
表の値を表示
select city,count(*) from tREaltyTrac group by city
select * from tREaltyTrac
不要な行を削除する
delete from tREaltyTrac
from tREaltyTrac
inner join (select
city,creation, row_number() over(partition by city order by city) AS RankValue
from tREaltyTrac
) dt on tREaltyTrac.city=dt.city AND tREaltyTrac.creation=dt.creation
where dt. RankValue>10
残っている行を表示
select * from tREaltyTrac
select city,count(*) from tREaltyTrac group by city
他のヒント
このようなものはあなたのためにそれの世話をする必要がありますが、レコードを自動的に削除することは素晴らしいアイデアではありません。アクティブなフラグを使用する方が良いでしょう。
DECLARE @CityName VARCHAR(30)
DECLARE CitiesOver10 CURSOR FOR select city from tREaltyTrac group by city having count(city)>10
OPEN CitiesOver10
FETCH NEXT FROM CitiesOver10 INTO @CityName
WHILE @@FETCH_STATUS = 0
BEGIN
DELETE FROM
dbo.tREaltyTrac
WHERE
ID NOT IN (SELECT TOP 10 ID FROM dbo.tREaltyTrac WHERE city = @CityName ORDER BY Creation DESC)
AND City = @CityName
FETCH NEXT FROM CitiesOver10 INTO @CityName
END
CLOSE CitiesOver10
DEALLOCATE CitiesOver10
データベースからレコードを削除しないでください。 これは100%完璧ではありません。もっと良い方法があると確信していますが、ここに行きます。
declare @cities (CityName nvarchar(50), ID int identity(1,1))
declare @returns (CityName nvarchar(50), Blah nvarchar(50))
declare @cityname nvarchar(50)
declare @count int
declare @i int
insert into @cities (CityName)
select distinct CityName
from tblCities
select @count = count(*) from @cities
set @i=1
while (@i<=@count)
begin
select @cityname = CityName from @cities where ID=@i
select top 10 *
from tblCities
where CityName=@cityname
order by Creation desc
set @i=@i+1
end
実際に実際のコードを記述する時間はありませんが、このようなものはどうでしょうか....(PHPを想定)
- 最初のクエリを注文-作成DESC を追加
- 結果をループして、10番目の結果の作成日を取得します
- 10番目の結果の作成値未満のすべてを削除する別のクエリを実行しますか? -つまり、 DELETE WHERE Creation <!> lt; $ creationDateOfTenthResult
意味のある希望...
トップ10を選択し、一時テーブルに入れ、元のテーブルを削除して、一時テーブルを追加します。
SQLのバージョンによって異なります。これに似た何かが動作する可能性があります
SELECT r.City、b。* tREaltyTrac rから b.IdでtREaltyTrac bに参加します (tREaltyTracから上位10個のIDを選択します。ここで、Id = r.Id Id Descによる順序) r.Cityによるグループ化