2009-05-01 78 views
2

我有一個房屋列表表。我想每個城市最多保留10個房源。 (大多數城市的房源不足10個)。SQL刪除循環

當我做這個查詢:

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 

所以阿德蘭託,阿克倫,奧爾巴尼和亞歷山大必須削減至僅10最近的日期時間字段排序列表稱爲'創造'(按照創造desc的順序)。

任何人都可以想到一個過程,將減少列表回到所述?

+0

是否有一些你想要命令剔除城市的標準? – 2009-05-01 21:00:21

+0

我保持由創建desc(最新10)排序的前10名。 – Bryan 2009-05-01 21:09:36

+0

RDBMS風味和版本請... – 2009-05-01 21:12:48

回答

4

請勿循環!

我更喜歡用狀態標記行,但這會按照你的意願去做並刪除它們......

試試這個(SQL Server)的

設置表

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 
0

你不應該從數據庫中刪除記錄。 這不是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<[email protected]) 
begin 

    select @cityname = CityName from @cities where [email protected] 

    select top 10 * 
    from tblCities 
    where [email protected] 
    order by Creation desc 

    set @[email protected]+1 
end 
0

我沒有時間,現在寫出來的實際的代碼,但如何對這樣的事情......(假設PHP)

  1. 令你的初始查詢 - 添加創作DESC
  2. 遍歷結果並獲得第10個結果的創建日期
  3. 運行另一個刪除小於第10個結果創建值的查詢嗎? - 即刪去創作< $ creationDateOfTenthResult

希望是有道理的......

0

我會選擇前十名,扔在一個臨時表,刪除原,並與臨時填充它表。

1

像這樣的東西應該照顧它,但自動刪除記錄不是一個好主意。使用活動標誌會更好。

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 
0

取決於您的SQL版本。類似這樣的東西可能會奏效

SELECT r.City,B * FROM tREaltyTrac [R 在 加入tREaltyTrac B關於b.Id(選擇tREaltyTrac排名前10位ID其中,ID = r.Id訂單來自序號說明) group by r.City