2009-05-01 2 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 명부에 다시 ​​절단해야합니다 '창조 (creation)'에 의한 주문 (creation descruction by order).

누군가가 설명 된대로 목록을 다시자를 절차를 생각할 수 있습니까?

+0

도시의 도태를 주문할 기준이 있습니까? –

+0

나는 상위 10을 생성 desc (최신 10) 순으로 유지하고있다. – Bryan

+0

RDBMS의 맛과 버전 ... –

답변

4

DO NOT LOOP!

상태로 행을 표시하는 것이 더 좋지만 원하는대로 할 수 있습니다.

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 

테이블을 설정이 (SQL 서버)를 시도하면

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

삽입은 1 초 지연으로 실행되므로 시간이 다르기 때문에 가장 오래된 명령이 삭제 된 것임을 알 수 있습니다 –

+0

니스! 덜 기능이있는 SQL 엔진에서는 SQL Server가 중첩 된 선택으로 잘 처리되는 것에 대한 임시 테이블을 만드는 것이 좋습니다 (불행하게도 모든 엔진이 아직 sql'03 표준 "row_number (over partition)"를 지원하지는 않습니다. 한숨). –

+0

ROW_NUMBER() 순위 지정 기능을 사용하는 경우 +1! 동일한 접근 방식을 사용하는 두 개의 CTE에서 작업하고 있었지만 나를 펀치에 맞 춥니 다 .-) –

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 
+1

+1 레코드를 삭제하지 말 것을 권유합니다. –

+0

루핑이 매우 느리며,이 작업을 수행하는 방법이 있습니다. 단일 진술, 내 대답을 참조 –

+0

그래, 나는 그것을 할 수있는 더 좋은 방법이 있다고 생각, 난 단지 그 당시 생각할 수 없었다. 그게 내 코멘트의 일부가 된 이유입니다. – DForck42

0

  1. 주문하여 초기 쿼리 내가 지금 실제 코드를 작성하는 시간이 없어,하지만 어떻게 이런 일에 대해 .... (PHP는 가정) - 생성을 추가 DESC
  2. 결과를 반복하고 10 번째 결과의 생성 날짜를 얻습니다.
  3. 10 번째 결과의 생성 값보다 적은 모든 것을 삭제하는 다른 쿼리를 실행 하시겠습니까? - 즉, DELETE WHERE 창조 < $ creationDateOfTenthResult 의미가

희망 ...

+0

또 다른 가능한 해결책은 ... 날짜를 사용하는 대신 고유 한 ID 필드가 있고 삭제 쿼리가 DELETE WHERE uniqueID <$ uniqueIDOfTenthResult 일 수 있습니다. – Matt

+1

PHP? PHP에서 모든 행을 가져 오지 않고 루프를 반복하지 않고 거기에서 삭제하기를 바랍니다. 루핑은 매우 느립니다, 단일 SQL 문에서이 작업을 수행하는 방법이 있습니다. 내 대답 –

0
나는, 상위 10 선택, 임시 테이블에 던져 원본을 삭제하고 임시로 채울 것

표.

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

-1을 참조하십시오 - 전염병처럼 CURSORS를 피하십시오! 이것을하는 더 똑똑한 방법이 있습니다. –

+0

커서 루프가 매우 느리고, 일반적으로 하나의 문을 사용하는 방법이 있습니다 내 대답을 참조하십시오 –

0

사용중인 SQL 버전에 따라 다릅니다.

SELECT r.City 작동 수도 이와 비슷한먼트. tREaltyTrac FROM 가 가 에 b.Id에 tREaltyTrac B를 조인 r에 * (tREaltyTrac에서 상위 10 ID를 선택 여기서 식 r.Id 이드 제품 설명에 의한 순서) 그룹 by r.City