Vấn đề:
Bạn muốn nhóm dữ liệu của mình theo năm.
Ví dụ I:
Một trong các cột trong dữ liệu của bạn là transaction_date
. Nó chứa một ngày tháng. Bạn muốn nhóm tất cả dữ liệu của mình theo năm và tính tổng số tiền kiếm được mỗi năm.
Dữ liệu data
bảng trông như thế này:
transaction_date | tiền |
---|---|
2018-03-25 | 1700 |
2019-09-12 | 100 |
2018-07-14 | 1200 |
2018-01-05 | 400 |
2019-06-08 | 2000 |
2020-03-06 | 1500 |
Giải pháp 1 (hiển thị năm và số tiền kiếm được):
SELECT EXTRACT(year FROM transaction_date) AS year, SUM(money) AS money_earned FROM data GROUP BY EXTRACT(year FROM transaction_date);
Kết quả là:
năm | money_earned |
---|---|
2020 | 1500 |
2019 | 2100 |
2018 | 3300 |
Giải pháp 2 (hiển thị đầy đủ ngày, năm và số tiền kiếm được trong năm tương ứng):
SELECT transaction_date AS transaction_date, EXTRACT(year FROM transaction_date) AS year, SUM(money) OVER(PARTITION BY EXTRACT(year FROM transaction_date)) AS money_earned FROM data;
Kết quả là:
transaction_date | năm | money_earned |
---|---|---|
2018-03-25 | 2018 | 3300 |
2018-07-14 | 2018 | 3300 |
2018-01-05 | 2018 | 3300 |
2019-09-12 | 2019 | 2100 |
2019-06-08 | 2019 | 2100 |
2020-03-06 | 2020 | 1500 |
Thảo luận:
Trong ví dụ này, giả định rằng bạn không có year
cột. Thay vào đó, bạn có cột với đầy đủ ngày tháng.
Đầu tiên, bạn cần truy xuất một năm kể từ ngày. Bạn có thể sử dụng EXTRACT(part FROM date)
chức năng để làm điều đó. Trong trường hợp của bạn, bạn muốn trích xuất năm, vì vậy phần data
là year
. date
là cột chứa ngày - transaction_date
cột. Bạn nên đổi tên cột thành năm sau đó. Nếu bạn muốn tìm hiểu thêm về EXTRACT
chức năng và cách truy xuất các phần khác nhau từ ngày tháng, bạn có thể tìm thấy nó tại đây.
Nếu bạn chỉ muốn hiển thị năm và tổng số tiền kiếm được trong năm này, bạn có thể sử dụng GROUP BY
. Cột được chọn đầu tiên là năm được trích từ ngày. Cột thứ hai là hàm tổng hợp SUM(money)
. Khi kết thúc truy vấn, bạn cần có GROUP BY EXTRACT(year FROM transaction_date)
hoặc đơn giản hơn, GROUP BY 1 (since EXTRACT(year FROM transaction_date)
là cột đầu tiên.)
Nếu bạn muốn hiển thị nhiều cột hơn, bạn cần có chức năng cửa sổ (Giải pháp 2). Sau SUM(money)
bạn viết OVER()
và vì bạn muốn tính tổng cho mỗi năm, hãy sử dụng PARTITION BY EXTRACT(year FROM transaction_date)
bên trong nó. Lưu ý rằng bạn chưa có cột năm khi tính tổng, vì vậy PARTITION BY year
sẽ không hoạt động - bạn sẽ gặp lỗi 'column "year" does not exist'
. Bạn có thể đọc thêm về các chức năng của cửa sổ trong bài viết này.
Ví dụ II:
Một trong các cột trong dữ liệu của bạn là year
. Bạn muốn nhóm tất cả dữ liệu của mình theo cột này và tính tổng số tiền kiếm được mỗi năm.
Dữ liệu data
bảng trông như thế này:
năm | tháng | ngày | tiền |
---|---|---|---|
2018 | 3 | 25 | 1700 |
2019 | 9 | 12 | 100 |
2018 | 7 | 14 | 1200 |
2018 | 1 | 5 | 400 |
2019 | 6 | 8 | 2000 |
2020 | 3 | 6 | 1500 |
Giải pháp 1 (hiển thị năm và số tiền kiếm được):
SELECT year, SUM(money) AS money_earned FROM data GROUP BY year;
Kết quả là:
năm | money_earned |
---|---|
2020 | 1500 |
2018 | 3300 |
2019 | 2100 |
Giải pháp 2 (hiển thị năm, tháng, ngày và số tiền kiếm được trong năm tương ứng):
SELECT year, month, day, SUM(money) OVER(PARTITION BY year) AS money_earned FROM data;
Kết quả là:
năm | tháng | ngày | money_earned |
---|---|---|---|
2018 | 3 | 25 | 3300 |
2018 | 7 | 14 | 3300 |
2018 | 1 | 5 | 3300 |
2019 | 9 | 12 | 2100 |
2019 | 6 | 8 | 2100 |
2020 | 3 | 6 | 1500 |
Thảo luận:
Trong ví dụ này, giả sử rằng bạn đã có year
cột.
Nếu bạn muốn hiển thị năm và tổng số tiền kiếm được trong năm này, một GROUP BY
đơn giản Là đủ. Nếu bạn không cảm thấy thoải mái với khái niệm GROUP BY
, hãy xem ở đây, nơi chúng tôi giải thích nó. Bạn chỉ cần sử dụng hàm tổng hợp (tại đây:SUM
) với cột đúng và ở cuối truy vấn, bạn nhóm theo year
. Bạn có thể đổi tên cột bằng AS
từ khóa có tên mới.
Nó phức tạp hơn nếu bạn cũng muốn hiển thị một số cột khác. Sau đó, bạn cần giải pháp bằng cách sử dụng chức năng cửa sổ (Giải pháp 2). Bạn nên sử dụng hàm tổng hợp với cột thích hợp (tại đây:SUM(money)
) và viết OVER()
mệnh đề sau đó. Trong mệnh đề này, bạn nên sử dụng PARTITION BY
với cột mà bạn muốn nhóm. Đó là cách bạn nhận được:
SUM(money) OVER(PARTITION BY year)
Trong giải pháp này, bạn không sử dụng GROUP BY
mệnh đề.
Bạn có thể đọc thêm về các chức năng của cửa sổ tại đây.