SQL Server

Sử dụng Over (PARTITION BY … ODER BY) kết hợp các hàm tính toán, so sánh với GROUP BY

Group by số lượng dòng kết quả trả về sẽ được ít hơn số dòng detail và phụ thuộc vào select (Select cái gì thì Group by cái đó) điều kiện của Group byHaving, điều kiện của SelectWhere

WITH VDOverPartition AS
 (SELECT 1 as ID , N'Thân Văn Hải' as Name, N'A' Team, 9 as Scores
  UNION ALL SELECT 2, N'Nguyễn Thị Ngọc Bích', N'A', 10
  UNION ALL SELECT 3, N'Trần Viết Nguyễn Minh Hiếu', N'A' , 8
  UNION ALL SELECT 4, N'Hồ Quốc Hiếu', N'B', 8
  UNION ALL SELECT 5, N'Hồ Trần Thương Thương,', N'B', 8
  UNION ALL SELECT 6, N'Trần Thị Hà', 'B', 9
  UNION ALL SELECT 7, N'Lê Bá Anh Minh', 'C', 10
  UNION ALL SELECT 8, N'Trần Thị Thủy', 'C', 10
  UNION ALL SELECT 9, N'Trần Phương Thảo', 'C', 8
  UNION ALL SELECT 10, N'Nguyễn Ngọc Ngạn', 'C', 9
)
SELECT Team, count(*) As NumberPerson, sum(Scores) as TotalScores
FROM VDOverPartition
where Scores <10
group by Team
having sum(Scores)<25 

Over (Partition by) linh động hơn sẽ không phụ thuộc select và giữ nguyên các dòng detail và thực hiện tính toán trên nhóm mà mình muốn và có thể tính toán theo trình tự sắp xếp được. Được dùng để xếp hạng (RANK () hoặc DENSE_RANK ()), tính tồn kho tại 1 thời điểm bất kỳ, tính lũy kế, tính lũy tiến, ….

Row_number(): đơn giản là… đánh số thứ tự của từng dòng theo nghĩa nguyên thủy nhất. 

Rank(): là hàm dùng để xếp hạng dữ liệu từ cao tới thấp (nghe giống row_number quá) tuy nhiên có một điểm cốt lõi làm rank khác row_number đó chính là rank sẽ có giá trị bị lặp lại khi data bị trùng lặp, không như row_number và thứ tự hạng sẽ bị nhảy nếu có trùng thứ hạng

DENSE_RANK(): có logic về thứ tự giống như rank, tức là cũng đánh số theo thứ tự, và có giá trị lặp khi cột có giá trị bị lặp lại. Tuy nhiên điểm khác biệt chính của dense rank là không bỏ đi thứ hạng dù cho thứ hạng gần nhất bị lặp lại nhiều lần. 

Tiếp tục đọc “Sử dụng Over (PARTITION BY … ODER BY) kết hợp các hàm tính toán, so sánh với GROUP BY”