by 초보 [SQLServer] [2024.04.12 01:41:48]
안녕하십니까?
sql server사용해야하는데요.
a,b,c,d,e,f,g,h컬럼이 있는 상황에서 a,b,c,d,e가 pk 입니다. a,b,c는 고정값이고 d,e가 자동으로 번호가 부여되는데
가장 최신 데이터를 찾아서 장표로 출력을 해야합니다. 아래에서 E가 나와야합니다.
('a1', 'cd1', '1', '1','1', 'A')
('a1', 'cd1', '1', '1','2', 'B')
('a1', 'cd1', '1', '2','1', 'C')
('a1', 'cd1', '1', '2','2', 'D')
('a1', 'cd1', '1', '2','3', 'E')
아래처럼 하면 원하는 값을 찾을수있긴 한데 장표테이블이여서 컬럼수도 많고 한데 이방법으로 해도 될지 의문 입니다.
①과②가 속도면에서 차이가 있나요?
① select a,b,c,d,e,f,g,h
from testTable
where (a+b+c+d+e) in
( select a+b+c+max(d+e) from testTable
group by a,b,c )
② select a,b,c,d,e,f,g,h
from testTable
inner join
( select a, b, c, max(d+e) as de from testTable
group by a, b, c ) as T2
on testTable.a = T2.a
and testTable.b = T2.b
and testTable.c = T2.c
and testTable.d+testTable.e = T2.de
d, e 가 자료형이 숫자인가요? 문자인가요?
- 따옴표를 붙여 놔서 문자('1')로 보이는데? 숫자(1)일 것 같은 느낌이 드네요.
- 숫자라면 문제 없는데. 진짜 문자라면 고려할 사항이 많습니다.
- 문자의 경우 고정길이(1자리) 인지? 가변길이 인지?
- 고정길이라면 문제 없는데. 가변길이라면 '10' 보다 '9' 를 크게 인지하는 오류가 있습니다.
답변감사합니다. 둘다 문자여서 말씀하신대로 길이 문제도 있고 단순이 연결해서 될 문제가 아니란걸 알게됐습니다. 감사합니다!
아래처럼 하면 원하는 값이 나오는데 고려할 사항이 더 있으면 조언 부탁드립니다!
select a,b,c,d,e,f,g,h from ( select *, rank()over(partition by a, b, c order by d desc,e desc) as No from testTable ) as T2 where T2.No =1
잘하셨습니다.
Rank 보다는 Row_number 가 더 적절합니다.
가변길이 문자에 저장된 수치 데이터라면?
그에 대한 처리가 필요합니다.
ROW_NUMBER() OVER(PARTITION BY a, b, c ORDER BY LEN(d) DESC, d DESC, LEN(e) DESC, e DESC) rn
감사합니다! 가변길이에대한 접근방법을 생각도 못했었는데 감사합니다!!