๋ชฉ์ฐจ
[โโ] ๋ค์๋ ๋ ์์ธ์ฒ์ ๋ฏธ์ธ๋จผ์ง ๋๋๋ ๋์จ ๐ข
์์ธ์ฒ ์ผ๋ณ ํ๊ท ๋๊ธฐ์ค์ผ๋ ๋ฐ์ดํฐ์ ์ 2022๋ ์์ธ์ฒ ๋๊ธฐ์ค์ผ๋ ์ธก์ ์์์ ๋งค์ผ ๊ธฐ๋กํ ๋๊ธฐ์ค์ผ ์ ๋ณด๋ฅผ ๋ด๊ณ ์์ต๋๋ค.
measurements ํ ์ด๋ธ์ pm10 ์ปฌ๋ผ์๋ ๋ค์ํ ๋๊ธฐ์ค์ผ๋ ์ธก์ ๊ธฐ์ค ์ค์์๋ ๋ฏธ์ธ๋จผ์ง(PM10) ๋๋๊ฐ ๊ธฐ๋ก๋์ด ์์ต๋๋ค. ์ด ๋ฐ์ดํฐ๋ฅผ ์ด์ฉํ์ฌ ๋น์ผ์ ๋ฏธ์ธ๋จผ์ง ๋๋๋ณด๋ค ๋ฐ๋ก ๋ค์๋ ์ ๋ฏธ์ธ๋จผ์ง ๋๋๊ฐ ๋ ์์ข์ ๋ ์ ์ฐพ์์ฃผ์ธ์. ๊ฒฐ๊ณผ๋ ์๋ ์ปฌ๋ผ๋ค์ ํฌํจํด์ผ ํฉ๋๋ค.
- today: ๋น์ผ (YYYY-MM-DD)
- next_day: ๋ค์๋ (YYYY-MM-DD)
- pm10: ๋น์ผ์ ๋ฏธ์ธ๋จผ์ง ๋๋
- next_pm10: ๋ค์๋ ์ ๋ฏธ์ธ๋จผ์ง ๋๋
SELECT
strftime('%Y-%m-%d', m1.measured_at) AS today,
strftime('%Y-%m-%d', m2.measured_at) AS next_day,
m1.pm10 AS pm10,
m2.pm10 AS next_pm10
FROM
measurements m1
join measurements m2 on m1.measured_at = date(m2.measured_at, '-1 day')
WHERE
m2.pm10 > m1.pm10
[โโโโโ] ์นดํ ๊ณ ๋ฆฌ ๋ณ ๋งค์ถ ๋น์จ
US E-Commerce Records 2020 ๋ฐ์ดํฐ์ ์ ๋ฏธ๊ตญ ์ด์ปค๋จธ์ค ์น์ฌ์ดํธ์ ํ๋งค ๋ฐ์ดํฐ ์ ๋๋ค. records ํ ์ด๋ธ์๋ ์ด๋ ์จ๋ผ์ธ ์ผํ๋ชฐ์ ์ฃผ๋ฌธ ๋ฐ์ดํฐ ์ ๋๋ค. ์ฃผ๋ฌธ๋ ์ํ์ ์นดํ ๊ณ ๋ฆฌ(category), ์๋ธ ์นดํ ๊ณ ๋ฆฌ(sub_category), ๋งค์ถ์ก(sales) ๋ฑ์ ์ ๋ณด๊ฐ ๋ค์ด์์ต๋๋ค.
์๋ธ ์นดํ ๊ณ ๋ฆฌ ๋ณ ๋งค์ถ์ก์ ๊ณ์ฐํ๊ณ ๊ทธ ๋งค์ถ์ก์ด ๊ฐ ์๋ธ ์นดํ ๊ณ ๋ฆฌ๊ฐ ์ํด์๋ ์นดํ ๊ณ ๋ฆฌ ์์์ ๋น์ค์ ์ผ๋ง๋ ์ฐจ์งํ๋์ง, ๊ทธ๋ฆฌ๊ณ ์ ์ฒด ๋งค์ถ์ก์์๋ ๋น์ค์ ์ผ๋ง๋ ์ฐจ์งํ๋์ง ๊ณ์ฐํ๋ ์ฟผ๋ฆฌ๋ฅผ ์์ฑํด์ฃผ์ธ์. ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ๋ ์๋ ์ปฌ๋ผ์ ํฌํจํด์ผ ํ๊ณ , ๋ชจ๋ ์์น ๋ฐ์ดํฐ๋ ์์์ ์๋ ์ ์งธ ์๋ฆฌ์์ ๋ฐ์ฌ๋ฆผ ํด ๋์งธ ์๋ฆฌ๊น์ง ํํํด์ฃผ์ธ์.
- category - ์นดํ ๊ณ ๋ฆฌ ์ด๋ฆ
- sub_category - ์๋ธ ์นดํ ๊ณ ๋ฆฌ ์ด๋ฆ
- sales_sub_category - ์๋ธ ์นดํ ๊ณ ๋ฆฌ ๋ณ ๋งค์ถ์ก์ ํฉ๊ณ
- sales_category - ์นดํ ๊ณ ๋ฆฌ ๋ณ ๋งค์ถ์ก์ ํฉ๊ณ
- sales_total - ์ ์ฒด ๋งค์ถ์ก
- pct_in_category - ์นดํ ๊ณ ๋ฆฌ ๋งค์ถ ์ค ํด๋น ์๋ธ ์นดํ ๊ณ ๋ฆฌ ๋งค์ถ์ ๋น์จ (%)
- pct_in_total - ์ ์ฒด ๋งค์ถ ์ค ํด๋น ์๋ธ ์นดํ ๊ณ ๋ฆฌ ๋งค์ถ์ ๋น์จ (%)
(1) OVER(PARTITION BY)๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ
WITH sub AS (
SELECT
category,
sub_category,
SUM(sales) AS sum_sales
FROM records
GROUP BY category, sub_category
)
SELECT
category,
sub_category,
ROUND(SUM(sum_sales) OVER(PARTITION BY sub_category), 2) AS sales_sub_category,
ROUND(SUM(sum_sales) OVER(PARTITION BY category), 2) AS sales_category,
ROUND(SUM(sum_sales) OVER(), 2) AS sales_total,
ROUND(SUM(sum_sales) OVER(PARTITION BY sub_category) / SUM(sum_sales) OVER(PARTITION BY category) * 100, 2) AS pct_in_category,
ROUND(SUM(sum_sales) OVER(PARTITION BY sub_category) / SUM(sum_sales) OVER() * 100, 2) AS pct_in_total
FROM sub;
(2) GROUP BY๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ (OVER ํจ์ X)
WITH
c AS (
SELECT
category,
sum(sales) as sales_category
FROM records
GROUP BY category
),
t AS (
SELECT
r.category,
r.sub_category,
ROUND(sum(r.sales), 2) as sales_sub_category,
ROUND(c.sales_category, 2) as sales_category,
ROUND(
(
SELECT
SEUM(sales)
FROM
records
),
2
) AS sales_total
FROM
records r JOIN c USING (category)
GROUP BY category,sub_category
)
SELECT
category,
sub_category,
sales_sub_category,
sales_category,
sales_total,
ROUND(sales_sub_category*100/sales_category,2) AS pct_in_category,
ROUND(sales_sub_category*100/sales_total,2) AS pct_in_total
FROM
t