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ê.
Like this:
Like Loading...
Related
Video liên quan