Bài học theo mô-đun (3/4)
Hàm số
PostgreSQL có tất cả các hàm số mà bạn mong đợi — cộng thêm một số hàm gõ những cạm bẫy đáng để biết ngay.
Các chức năng được sử dụng nhiều nhất
ROUND(price, 2) -- arrotonda a 2 decimali (banker's rounding "half to even")
CEIL(price) -- arrotonda per eccesso (verso +∞)
FLOOR(price) -- arrotonda per difetto (verso −∞)
ABS(-5) -- 5 (valore assoluto)
MOD(10, 3) -- 1 (resto della divisione) — anche 10 % 3
POWER(2, 10) -- 1024
SQRT(16) -- 4ROUND(number, decimals) chỉ hoạt động nếu number là NUMERIC (không phải
DOUBLE PRECISION). Trong tập dữ liệu của chúng tôi products.price là NUMERIC(10,2),
vậy là chúng ta đã sẵn sàng rồi.
Số nguyên và phép chia thập phân
Cạm bẫy kinh điển:
SELECT 1 / 2; -- 0 (entrambi interi → divisione intera!)
SELECT 1.0 / 2; -- 0.5
SELECT 1::numeric / 2; -- 0.50000000000000000000Khi bạn chia hai cột INTEGER bạn sẽ nhận được INTEGER. Để tránh
cắt ngắn, truyền một trong số chúng thành NUMERIC hoặc nhân với 1.0:
-- Sbagliato: percentuale sempre 0 finché numeratore < denominatore
SELECT shipped / total FROM …;
-- Corretto:
SELECT shipped::numeric / total FROM …;
SELECT ROUND(shipped * 100.0 / total, 2) AS percentage FROM …;Ví dụ về tập dữ liệu
-- Prezzo scontato del 10%, arrotondato a 2 decimali:
SELECT name,
price,
ROUND(price * 0.9, 2) AS discounted_price
FROM products
ORDER BY id;
-- Prezzo "psicologico" sempre arrotondato per eccesso al multiplo di 1:
SELECT name, CEIL(price) AS rounded_price
FROM products
WHERE price < 100
ORDER BY price;Hãy thử nó
Đối với mỗi sản phẩm hiển thị tên, giá (giá gốc) và giá_giảm (giá giảm 10%, làm tròn đến 2 số thập phân). Đặt hàng theo id.
Hiển thị gợi ý
Giảm giá 10% bằng cách nhân với 0,9 rồi làm tròn bằng ROUND(..., 2).
Giải pháp khả dụng sau 3 lần thử
Xem lại bài tập
Đối với mỗi đơn hàng đã giao (trạng thái = 'đã giao'), hiển thị id và wait_days dưới dạng số nguyên ngày (làm tròn xuống) giữa order_at vàship_at. Sắp xếp theo wait_days giảm dần, sau đó theo id.
Hiển thị gợi ý
shipped_at - ordered_at returns an INTERVAL; EXTRACT(EPOCH FROM …) turns it into seconds; divide by 86400 (seconds in a day) and take the FLOOR.
Giải pháp khả dụng sau 3 lần thử