Вопрос
У меня есть таблица списков жилья. Я хотел бы сохранить максимум 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
Таким образом, Аделанто, Акрон, Олбани и Александрия должны быть сокращены только до 10 списков, упорядоченных по самому последнему полю даты и времени, называемому «создание» (заказ по созданию дескриптора). Р>
Может кто-нибудь придумать процедуру, которая сократит списки, как описано?
Решение
НЕ СКАЧАТЬ!
Я предпочитаю помечать th строки статусом, но это будет делать, как вы хотите, и удалять их ...
попробуйте это (сервер 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)
<Ол>Надеюсь, это имеет смысл ...
Я бы выбрал первую десятку, выбросил их во временную таблицу, удалил оригинал и заполнил его временной таблицей.
Зависит от вашей версии SQL. Нечто подобное может сработать
SELECT r.City, b. * ОТ ТРЕАЛТИЙТРАК Р присоединиться к tREaltyTrac b на б.Id в (выберите 10 лучших идентификаторов из tREaltyTrac, где Id = r.Id по Id Desc) группа по г.Сити