Aggregate SQL là gì

Câu đố vui 2 được post trên group Quản trị CSDL SQL Server, bài viết này nhằm cung cấp đáp án và một vài cách truy vấn giúp xác định một tập chứa các số tăng dần có bị gián đoạn hay không, bằng cách sử dụng các hàm thống kê SQL.

Bảng T1 có cấu trúc và được insert 10k dòng dữ liệu như hình ở phần comment. Nếu chúng ta được yêu cầu kiểm tra xem giá trị cột data1 có liên tiếp, không bị gián đoạn hoặc lặp lại thì sử dụng câu truy vấn nào dưới đây vừa đủ dữ kiện để kết luận?

CREATE DATABASE labdb01 GO CREATE TABLE T1[id INT IDENTITY PRIMARY KEY CLUSTERED, data1 BIGINT, data2 DATETIME, data3 CHAR[64]] BEGIN TRANSACTION DECLARE @i INT = 1 WHILE @i loại. Bảng T1_HighX có giá trị lớn nhất là 10001 -> loại. Bảng T1_LessX có tổng số dòng không đủ 10K -> loại. Bảng T1_MoreX có tổng số dòng hơn 10K -> loại. Bảng T1_Double5 với T1_Tripple5 mặc dù có đủ 10K dòng và giá trị đầu với cuối đều giống mong đợi, nhưng các giá trị nằm trong khoảng giữa lại nhảy loạn xạ không đủ số lượng giá trị duy nhất -> loại. Chỉ có bảng T1 là thỏa mãn điều kiện của bài toán.

Sử dụng hàm ranking trong SQL

Chúng ta có thể sử dụng hàm ranking windows function để đạt được mục đích tương tự như vậy. Với ý tưởng sắp xếp cột data1 theo thứ tự tăng dần và đánh số từ 1 tới 10000, kết quả thu được sẽ là cột thứ tự với giá trị bằng giá trị cột data1.

USE labdb01 GO ;WITH ttmp AS [ SELECT *, ROW_NUMBER[] OVER[ORDER BY data1 ASC] AS Num FROM T1 ] SELECT * FROM ttmp

Kết quả sẽ như hình dưới đây

Kết quả hàm ROW_NUMBER[] trên bảng T1

Vậy chúng ta chỉ cần xét điều kiện tồn tại dòng dữ liệu mà cột data1 khác với cột Num thì bảng đó không thỏa điều kiện.

USE labdb01 GO ;WITH ttmp AS [ SELECT *, ROW_NUMBER[] OVER[ORDER BY data1 ASC] AS Num FROM T1 ] SELECT TOP 1 'T1',* FROM ttmp WHERE data1 Num ;WITH ttmp AS [ SELECT *, ROW_NUMBER[] OVER[ORDER BY data1 ASC] AS Num FROM T1_LowX ] SELECT TOP 1 'T1_LowX',* FROM ttmp WHERE data1 Num ;WITH ttmp AS [ SELECT *, ROW_NUMBER[] OVER[ORDER BY data1 ASC] AS Num FROM T1_HighX ] SELECT TOP 1 'T1_HighX',* FROM ttmp WHERE data1 Num ;WITH ttmp AS [ SELECT *, ROW_NUMBER[] OVER[ORDER BY data1 ASC] AS Num FROM T1_LessX ] SELECT TOP 1 'T1_LessX',* FROM ttmp WHERE data1 Num ;WITH ttmp AS [ SELECT *, ROW_NUMBER[] OVER[ORDER BY data1 ASC] AS Num FROM T1_MoreX ] SELECT TOP 1 'T1_MoreX',* FROM ttmp WHERE data1 Num ;WITH ttmp AS [ SELECT *, ROW_NUMBER[] OVER[ORDER BY data1 ASC] AS Num FROM T1_Double5 ] SELECT TOP 1 'T1_Double5',* FROM ttmp WHERE data1 Num ;WITH ttmp AS [ SELECT *, ROW_NUMBER[] OVER[ORDER BY data1 ASC] AS Num FROM T1_Triple5 ] SELECT TOP 1 'T1_Triple5',* FROM ttmp WHERE data1 Num
Những bảng có cột data1 không khớp với Num.

Những bảng nào xuất hiện bất kì dòng dữ liệu có cột data1 không khớp với Num chứng tỏ không thỏa mãn điều kiện bài toán. Chúng ta thấy kết quả câu truy vấn ứng với bảng T1 không có dòng nào -> đây là bảng thỏa điều kiện dữ liệu cột data1 chạy từ 1 đến 10000 và không bị gián đoạn, giống với kết quả ở trên khi sử dụng các hàm thống kê.

Share this:

  • Twitter
  • Facebook

Like this:

Like Loading...

Related

Video liên quan

Chủ Đề