Tôi đang sử dụng SQL Server 2016 và dữ liệu tôi đang tiêu thụ có dạng sau.
CREATE TABLE #tab (cat CHAR(1), t CHAR(2), val1 INT, val2 CHAR(1));
INSERT INTO #tab VALUES
('A','Q1',2,NULL),('A','Q2',NULL,'P'),('A','Q3',1,NULL),('A','Q3',NULL,NULL),
('B','Q1',5,NULL),('B','Q2',NULL,'P'),('B','Q3',NULL,'C'),('B','Q3',10,NULL);
SELECT *
FROM #tab;
Tôi muốn có được các giá trị khác không cuối cùng trên các cột val1và val2được nhóm theo catvà sắp xếp theo t. Kết quả tôi đang tìm kiếm là
cat val1 val2 A 1 P B 10 C
Gần nhất tôi đã đến đang sử dụng LAST_VALUEtrong khi bỏ qua ORDER BYcái sẽ không hoạt động vì tôi cần giá trị không null được đặt hàng cuối cùng.
SELECT DISTINCT
cat,
LAST_VALUE(val1) OVER(PARTITION BY cat ORDER BY (SELECT NULL) ) AS val1,
LAST_VALUE(val2) OVER(PARTITION BY cat ORDER BY (SELECT NULL) ) AS val2
FROM #tab
cat val1 val2 A NULL NULL B 10 NULL
Bảng thực tế có nhiều cột hơn cho cat( cột ngày và cột) và nhiều cột val hơn (cột ngày, chuỗi và số) để chọn giá trị khác không cuối cùng.
Bất kỳ ý tưởng làm thế nào để thực hiện lựa chọn này.
tgiá trị lặp lại. Nó không phải là dữ liệu ứng xử tốt.
PARTITION BY cat ORDER BY t, idví dụ. Mặt khác, cùng một truy vấn (bất kỳ truy vấn nào) có thể cung cấp cho bạn các kết quả khác nhau trên các lần thực hiện riêng biệt. Nếu các cột trong bảng chỉ là những cột bạn hiển thị, thì tôi không thấy làm thế nào chúng ta có thể có một thứ tự xác định!


catthứ tựt.