2012-01-20 3 views
2

열의 하위 집합을 선택하고 대기열에있는 위치를 기반으로 계산 된 열을 마지막에 추가하려는 표가 있습니다.SQL의 계산 열에 문제가 있습니다

ID : INT, 자동 증가, 기본 키 answertime : (관련있는) 다음과 같은 필드가 있습니다 날짜, 기본적으로

널 (NULL)이, 뭔가 큐에 제출 될 때, 그 answertime은 NULL입니다. 따라서 대기열에있는 항목의 ID와 대기열의 순위 (예 : 순위 1은 답변되지 않은 다음 항목 등)를 선택하고 싶습니다. 여기에 내가 생각하고 있었던 것이있다.

rank - id - COUNT 개 (아이디는 내 ID보다 작고 answertime은 null이 아님). 그러나, 나는이 쿼리의 구문에 문제가 있어요 : 당신이 마찬가지로 내리고, 집계 함수의 선택 내부를 포함 할 수 없습니다 꽤 확신하기 때문에 지금

SELECT id AS outerid, COUNT(
    SELECT * FROM tablename WHERE id<outerid AND answertime IS NOT NULL 
) 
FROM tablename 
WHERE answertime IS NULL; 

, 분명히, 이것은 잘못된 것입니다 SELECT 및 COUNT는 코드의 해당 지점에 SELECT를 삽입 할 수 없으므로 작동하지 않습니다 (WHERE 절에서만 사용할 수 있음).

그냥 SQL로 할 수 있습니까? 아니면 프로그램 끝에 논리를 추가해야합니까?

도움이된다면 SQL Server 2008에서이 작업을 수행합니다.하지만이 작업이 어떤 가치를 부여하는지는 의문입니다.

+1

NO 시간이 좋은 예를 제공하지만, ROW_NUMBER 함수를 검색 할 :

다음은 메소드의 구현입니다. 내가 너를 올바르게 이해했다면 네가 원하는대로 될 것이라고 생각한다. – HLGEM

답변

3

당신은 집합 하위 쿼리에서 SELECT *을 사용할 수 없습니다. 스칼라 결과로 COUNT 값을 얻을 수있는,이 시도 :

SELECT 
    id AS outerid, 
    (SELECT COUNT(Id) FROM tablename 
    WHERE id<outie.id AND answertime IS NOT NULL) 
FROM tablename outie 
WHERE answertime IS NULL; 

당신은 COUNT(*), COUNT(Id)을 사용하거나 다른 열이 정말 계신에 따라 사이에 자신을 위해 선택해야 할 수 있습니다.

+0

아, 내부 SELECT 쿼리를 시도 할 때 누락 된 부분을 확인했습니다. 내가 ID를 구별 할 수 있도록 FROM tablename 아우트 비트를 놓쳤습니다. 감사! – wibarr

+0

또는'(SELECT COUNT (answertime) FROM tablename WHERE id

1
SELECT id AS outerid, 
(SELECT COUNT(*) FROM tablename WHERE id < outerid AND answertime IS NOT NULL) AS othercol 
FROM tablename -- ? 
WHERE answertime IS NULL; 

또한 FROM 문은 어디에 있습니까?

+0

질문에 FROM 문을 추가했습니다. 나는 이것을 실제 쿼리에서 단순화하고 거기에 넣지 않았다. – wibarr

0

@HLGEM에서 제안한대로 ROW_NUMBER()을 사용하여 결과를 얻을 수 있습니다. 이 방법은 행을 tablenameid으로 정렬하고 id으로 나누고 answertime을 파티셔닝하지 않습니다. answertime이 NULL 인 모든 행의 순위 차이는 하위 쿼리에서 COUNT()을 사용하여 계산하는 것과 동일한 값을 제공합니다.

; 
WITH ranked AS (
    SELECT 
    *, 
    Rnk  = ROW_NUMBER() OVER (      ORDER BY id), 
    PartRnk = ROW_NUMBER() OVER (PARTITION BY answertime ORDER BY id) 
    FROM tablename 
) 
SELECT 
    id, /* AS outerid, if you like */ 
    Cnt = Rnk - PartRnk 
FROM ranked 
WHERE answertime IS NULL