2014-06-20 1 views
0

사용자 테이블이 있으며 테이블의 한 필드는 회사입니다.필드 A로 정렬하고 특정 제한 후 필드 A가 변경된 경우에만 중지

나는 제한된 수의 사용자를 처리하고 있으므로 limit (x)를 사용합니다. 나는 회사별로 그들을 분류하고 회사가 바뀔 때 나의 한계가 끝나기를 원한다. 한 회사의 사용자는 처리하고 다른 사용자는 처리하지 못하게하고 싶습니다. 그러나 나는 회사의 숫자가 아닌, 하루에 최소한의 사용자 수를 처리하려고합니다.

예 I는 회사 A로부터 3 사용자, 회사 C에서 회사 B, (3)로부터 2 사용자 있고 (처리하는 최소) (4)의 한계

그것은 현재 여기 분할한다있는 경우

AAAB] [CCC - [BCCC> I가 회사 B.에서

AAABB을 회사 A + 모든 사용자가 모든 사용자가 할

좋지 (I는 B 1 사용자가 처리하고 다른 하나는 처리하지 않음)] -> 좋은

이 경우 처리 할 최소 사용자 수로 limit를 사용하고 싶습니다.

현재 실제 제한 (4)에 도달 한 후 회사가 변경되었지만 작동하지 않으면 User.order (lower ('company')). 제한 (4 + 10) 및 루프를 각각 반복합니다. 10 명 이상의 사용자가있는 회사가있는 경우 게다가 그것은 매우 가난한 해결책 일뿐입니다.

(1 개의 간단한 SQL 문에서 이상적으로) 가장 좋은 방법은 무엇입니까? 액티브 레코드 구문 보너스 포인트

주목할 가치가있다. 데이터베이스에 10,000 개의 행이있다.

+0

을 최적화 할 수 있는가? (PostgreSQL, MySQL 등) –

+0

PostgreSQL (Heroku) – Jeremy

+0

해결 했습니까? –

답변

0

하위 쿼리 내에서 회사에 대한 순위 (창 함수)를 사용할 수 있습니다.

  1. 4 번째 행 (하위 쿼리)의 순위를 찾습니다.
  2. 네 번째 행의 순위보다 작거나 같은 행을 선택하십시오 (기본 쿼리).

    선택 * 에서 ( 선택 * 사용자 에서 KR 같은 기업에 의해 (주문)를 통해 DENSE_RANK()) 탭 곳 KR < = ( 선택 DENSE_RANK() 기업에 의해 (주문) KR 등의 이상 사용자가 1 오프셋 LIMIT에서 4 )

는 사용하는 SQL의 유형