我有一份住房清单表。我想在每个城市最多保留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个列表,名为'creation'(按创建desc排序)。
任何人都可以想到一个会按照描述缩减列表的程序吗?
答案 0 :(得分: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
答案 1 :(得分: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
答案 2 :(得分: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<=@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
答案 3 :(得分:0)
我现在没有时间写出实际的代码,但是这样的事情怎么样......(假设是PHP)
希望有道理......
答案 4 :(得分:0)
我会选择前十名,将它们放入临时表中,删除原文并用临时表填充它。
答案 5 :(得分:0)
取决于您的sql版本。类似的东西可能会起作用
SELECT r.City,b。* 来自tREaltyTrac r 加入tREaltyTrac b on b.Id in (从tREaltyTrac中选择前10个Id,其中Id = r.Id order by Id Desc) r.City小组