안녕하세요!
다시 돌아온 sql 초보 입니다 ㅎㅎ
https://dzkm.tistory.com/16
위 링크에 보시면 조건에 따른 상위 랭커를 뽑으려고 하는데
limit 100 by 컬럼명 사용하라고 하는데
line 23:10: mismatched input 'by'. Expecting: <EOF> 이렇게 에러가 납니다...........................
해당 방법이 문제가 있는 걸까요? 다른 방법이 있을까요?
고수님들 도움 부탁드립니다ㅠㅠ
링크의 글은 clickhouse라는 dbms에서 지원하는 syntax 같네요.
사용하시는 DB에서 지원되는지 확인해보셔야 할 것 같습니다.
그럼 다른 사용할 수 있는 함수가 있을까요? 아니면 항목별로 쿼리를 만들어야 할까요..?
DBMS를 정확히 알수 없지만 row_number나 rank, dense_rank 같은 함수가 지원된다면 그걸로 순번을 매긴후 활용하시면 될것같네요.
http://www.gurubee.net/lecture/2672
https://stackoverflow.com/questions/44923353/unable-to-select-top-10-records-per-group-in-sparksql
SELECT *
FROM (SELECT c1
, c2
, RANK() OVER(PARTITION BY c1 ORDER BY c2 DESC) rk
FROM t
) a
WHERE rk <= 100
;
select
si.상품id,
LTRIM(sk.name,'[단어] ') AS name,
CASE
WHEN sk.temperature is null
then '상온'
else sk.temperature
end AS temperature,
sum(si.quantity) as quantity
from oo.raw pr
join (select --- from ----) os on pr.id = os.id
join (select --- from ----) si on pr.id = si.id
join (select --- from ----) sk on si.상품id = sk.id
where os.date between timestamp '2023-11-12 08:00:00' and timestamp '2023-11-19 08:00:00'
and pr.id = 20
and pr.group = '개별'
group by 1,2,3
order by 수량 desc
제가 사용한 쿼리입니다. 일부 내용들 보안상 문제로 단어 변경 하였습니다.
총 4가지 온도에 따른 top 100 을 뽑고 싶습니다.
rank 함수를 어디에 붙여야 할지 모르겠습니다... 도움 부탁드립니다. 감사합니다!
SELECT *
FROM (SELECT si.상품id
, LTRIM(sk.name, '[단어] ') AS name
, IFNULL(sk.temperature, '상온') AS temperature
, SUM(si.quantity) AS quantity
, ROW_NUMBER() OVER(PARTITION BY IFNULL(sk.temperature, '상온')
ORDER BY SUM(si.quantity) DESC) rn
FROM oo.raw pr
JOIN (SELECT ... FROM ...) os ON pr.id = os.id
JOIN (SELECT ... FROM ...) si ON pr.id = si.id
JOIN (SELECT ... FROM ...) sk ON si.상품id = sk.id
WHERE os.date >= TIMESTAMP '2023-11-12 08:00:00'
AND os.date < TIMESTAMP '2023-11-19 08:00:00'
AND pr.id = 20
AND pr.group = '개별'
GROUP BY 1, 2, 3
) a
WHERE rn <= 100
;
맘에 안드는 부분들 수정했습니다.
1. CASE 대신 IFNULL 사용했습니다.
2. Between 대신 부등호 사용했습니다. 한쪽은 등호(=)가 없는게 맞을 듯 합니다.
안녕하세요! 오늘도 좋은아침이 되셨으면 좋겠습니다 :-D
위 주신 쿼리문으로 적용을 해봤는데 ifnull 사용이 안되는 것 같습니다ㅠㅠ
line 4:16: Function 'ifnull' not registered
해당 DB 에서 널 대체 함수 있는지 확인해 보시고
없으면 CASE 문 그대로 사용하시면 됩니다.
오라클 : NVL
MSSQL : ISNULL
MySQL : IFNULL
공통 : COALESCE
COALESCE로 해결했습니다!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
감사합니다 오늘도 너무너무 감사합니다
행복한 하루 보내세요!