특정 행의 rownum을 반환하려면 SQL? (Oracle DB 사용)
문제
Oracle 10G에는이 SQL이 있습니다.
select dog.id as dogId from CANINES dog order by dog.codename asc
반환 :
id
--
204
203
206
923
이 쿼리를 확장하여 개의 Oracle Rownum을 결정하고 싶습니다.
나는 시도했다
select rownum from
(select dog.id as dogId from CANINES dog order by dog.codename asc)
where dog.id=206
그러나 이것은 잘 작동하지 않습니다 (Dog.id에 상관없이 1이 반환됩니다). 나는 돌아올 것으로 기대했다.
당신의 도움을 주셔서 감사합니다!
메모
http://www.oracle.com/technology/oramag/oracle/06-sep/o56asktom.html
rowid를 사용할 필요가 없다고 확신합니다.
해결책
나는 당신이 원하는 것이 분석 기능을 사용하는 것입니다 (순위, DENSE_RANK
, 또는 ROW_NUMBER
), 즉
SELECT rnk
FROM (select dog.id as dogId,
ROW_NUMBER() OVER( ORDER BY dog.codename ASC ) rnk
from CANINES dog )
WHERE dogId = 206
송곳니 테이블의 ID 열이 고유하지 않으면 순위, DENSE_RANK
, 그리고 ROW_NUMBER
) 타이를 다르게 취급 할 것입니다.
Rownum과 함께 이것을하고 싶다면
SELECT rn
FROM (
SELECT dogId, rownum rn
FROM (select dog.id as dogId
from CANINES dog
order by dog.codename ASC) inner
) middle
WHERE dogId = 206
다른 팁
테이블에서 각 행의 고유 식별자를 사용하는 경우 Rownum이 아닌 Rowid가 필요합니다.
rownum은 약간의 SQL이 실행될 때마다 변경할 수있는 의사 콜럼입니다 (쿼리 시간에 해결되었습니다)
이것이 당신에게 효과가 있는지 확인하십시오 :
대답
SELECT dog1.DogID, dog1.DogName, COUNT(*) AS rownumber
FROM #ids dog1, #ids dog2
WHERE dog2.DogName <= dog1.DogName
GROUP BY dog1.DogID, dog1.DogName
ORDER BY dog1.DogName
결과
DogID DogName rownumber
----------- ---------- -----------
204 Dog 1 1
203 Dog 2 2
206 Dog 3 3
923 Dog 4 4
DDL
CREATE TABLE #ids (DogID int NOT NULL PRIMARY KEY, DogName varchar(10) NOT NULL)
INSERT INTO #ids (DogID, DogName) VALUES (204, 'Dog 1')
INSERT INTO #ids (DogID, DogName) VALUES (203, 'Dog 2')
INSERT INTO #ids (DogID, DogName) VALUES (206, 'Dog 3')
INSERT INTO #ids (DogID, DogName) VALUES (923, 'Dog 4')
이를 달성하기 위해 테이블을 변경하고 시퀀스를 추가하는 것이 가장 좋습니다. 행을 삭제하려면 끈적 거리게 될 수 있습니다. 아마도 더 나은 관행은 상태 열 또는 스타트 엔드 데이트 모티프를 사용하여 어떤 행이 활성화되어 있고 반환 해야하는지 결정하는 것입니다.
제휴하지 않습니다 StackOverflow