๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
Database/MySQL

[MySQL]์ค‘๋ณต ์ œ๊ฑฐ ์‹œ ์‚ฌ์šฉํ•˜๋Š” DISTINCT

by sukii 2025. 4. 3.

๐Ÿค” 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