๐ค DISTINCT๋?
DISTINCT๋ ์ค๋ณต๋ ํ์ ์ ๊ฑฐํ์ฌ ์ ์ผํ ๊ฒฐ๊ณผ๋ง ๋ฐํํ๋ค.
๊ธฐ๋ณธ ๋ฌธ๋ฒ์ ์๋์ ๊ฐ์.
SELECT DISTINCT ์ปฌ๋ผ1, ์ปฌ๋ผ2, ...
FROM ํ
์ด๋ธ๋ช
;
๐จโ๐ป DISTINCT ์์
SELECT DISTINCT
o.customer_id,
o.order_id,
o.delivery_status,
COUNT(o.product_id) OVER (
PARTITION BY o.customer_id, o.order_id, o.delivery_status
) AS product_count
FROM orders o
WHERE o.is_cancelled = 'N';
DISTINCT๋ฅผ ํ์ฉํด, ๊ณ ๊ฐ ID, ์ฃผ๋ฌธ ID, ๋ฐฐ์ก ์ํ๊ฐ ๋์ผํ ๊ฒฝ์ฐ ์ค๋ณต์ ์ ๊ฑฐํ๊ณ ๊ณ ์ ํ ์กฐํฉ๋ง ๊ฒฐ๊ณผ์ ํฌํจํ๋ค.
๐ก๊ทผ๋ฐ ์ฌ๊ธฐ์ ์ค์ํ๊ฑด DISTINCT ๋ฐ๋ก ๋ค์ ๋์ค๋ customer_id ์ปฌ๋ผ๋ง ๊ธฐ์ค์ผ๋ก ์ค๋ณต์ ๊ฑฐ๋ฅผ ํ๋ ๊ฒ์ด ์๋๋ผ, o.customer_id + o.order_id + o.delivery_status ์ด ์ธ๊ฐ์ ์กฐํฉ์ด ๋ชจ๋ ์ค๋ณต๋๋ ํ๋ง ์ ๊ฑฐํ๋ ๊ฒ์ด๋ค.
๊ทธ๋ฌ๋ฏ๋ก ๋ง์ฝ o.customer_id ์ปฌ๋ผ์ ๊ธฐ์ค์ผ๋ก๋ง DISTINCTํ๋ฉด์, ๋๋จธ์ง ๋ ์ปฌ๋ผ(o.order_id / o.delivery_status)์ ์กฐํํ๊ณ ์ถ๋ค๋ฉด ์๋์ ๊ฐ์ด GROUP BY๋ฅผ ์ฌ์ฉํด์ ์ค๋ณต์ ๊ฑฐ๋ฅผ ํด์ผํ๋ค.
โซ GROUP BY
SELECT
o.customer_id,
MAX(o.order_id) AS latest_order_id,
MAX(o.delivery_status) AS delivery_status
FROM orders o
WHERE o.is_cancelled = 'N'
GROUP BY o.customer_id;
โซ ์๋์ฐ ํจ์
์๋์ฐ ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ์ค๋ณต ์ ๊ฑฐ๋ ์๋๋๋ผ๋ ๊ฐ์ ๊ฒฐ๊ณผ๋ฅผ ๋์ถํ ์ ์๋ค. ์๋ฅผ ๋ค์ด ๊ณ ๊ฐ๋ณ๋ก ๊ฐ์ฅ ์ต๊ทผ ์ฃผ๋ฌธ ํ ๊ฑด๋ง ์กฐํํ๊ณ ์ถ์ ๋, ์๋์ ๊ฐ์ด ROW_NUMBER() ์๋์ฐ ํจ์๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
SELECT customer_id, order_id, delivery_status
FROM (
SELECT *,
ROW_NUMBER() OVER (
PARTITION BY customer_id
ORDER BY order_date DESC
) AS rn
FROM orders
WHERE is_cancelled = 'N'
) ranked
WHERE rn = 1;
๐คทโโ๏ธ๊ฒฐ๋ก
๐ ๋ชจ๋ ๊ฐ์ด ์์ ํ ๋๊ฐ์ ํ์ด ์ฌ๋ฌ ๊ฐ ์๋ค๋ฉด? โ DISTINCT๋ฅผ ์จ์ ๊ฒน์น๋ ๊ฑด ํ๋๋ง ๋จ๊ธฐ๊ธฐ
๐ ํน์ ์ปฌ๋ผ(name, id ๋ฑ) ๊ธฐ์ค์ผ๋ก ๋ฌถ๊ณ , ๊ทธ ์์์ ๋ํ ๊ฐ์ ํ๋๋ง ๋ณด๊ณ ์ถ๋ค๋ฉด? โ GROUP BY๋ฅผ ์จ์ MAX, MIN ๊ฐ์ ํจ์๋ก ๋ํ ๊ฐ์ ๋ฝ์์ฃผ๊ธฐ
๐ ๊ทธ๋ฃน์ผ๋ก ๋ฌถ๊ธด ๋ฌถ๋, ๊ฐ์ฅ ์ต๊ทผ ๊ฑฐ๋ ์กฐ๊ฑด์ ๋ง๋ ๋ฑ ํ๋๋ง ๊ณจ๋ผ๋ณด๊ณ ์ถ๋ค๋ฉด? โ ROW_NUMBER() ๊ฐ์ ์๋์ฐ ํจ์๋ฅผ ์จ์ ๋ด๊ฐ ์ํ๋ ๊ธฐ์ค์ผ๋ก ํ ๊ฑด๋ง ์ ํ ๊ฐ๋ฅ
'Database > MySQL' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[MySQL]DATE_FORMAT ํจ์ (0) | 2024.08.30 |
---|---|
[MySQL] IFNULL ํจ์ (Oracle์ NVL๊ณผ ๊ฐ์ ์ญํ ) (0) | 2024.06.04 |