2009-05-01 77 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