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 val1
và val2
được nhóm theo cat
và 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_VALUE
trong khi bỏ qua ORDER BY
cá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.
t
giá trị lặp lại. Nó không phải là dữ liệu ứng xử tốt.
PARTITION BY cat ORDER BY t, id
ví 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!
cat
thứ tựt
.