ฉันใช้ SQL Server 2016 และข้อมูลที่ฉันใช้อยู่มีแบบฟอร์มต่อไปนี้
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;
ฉันต้องการขอรับค่าที่ไม่ใช่ null สุดท้ายมากกว่าคอลัมน์val1
และval2
จัดกลุ่มตามและได้รับคำสั่งจากcat
t
ผลลัพธ์ที่ฉันต้องการคือ
cat val1 val2 A 1 P B 10 C
สิ่งที่ฉันเข้ามาใกล้ที่สุดคือการใช้LAST_VALUE
ขณะที่เพิกเฉยสิ่งORDER BY
ที่ไม่สามารถใช้งานได้เนื่องจากฉันต้องการค่าที่ไม่ใช่ค่าว่างที่สั่งล่าสุด
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
ตารางจริงมีคอลัมน์มากขึ้นสำหรับcat
( คอลัมน์วันที่และสตริง) และคอลัมน์ val เพิ่มเติม (คอลัมน์วันที่, สตริงและตัวเลข) เพื่อเลือกค่าที่ไม่เป็นค่าสุดท้าย
ความคิดใด ๆ วิธีการเลือกนี้
t
ค่าซ้ำ มันเป็นข้อมูลที่ไม่ประพฤติดี
PARTITION BY cat ORDER BY t, id
ตัวอย่างเช่น. มิฉะนั้นข้อความค้นหาเดียวกัน (แบบสอบถามใด ๆ ) อาจให้ผลลัพธ์ที่แตกต่างกันสำหรับการดำเนินการแยกต่างหาก หากคอลัมน์ในตารางเป็นเพียงคอลัมน์ที่คุณแสดงฉันไม่เห็นว่าเราจะมีคำสั่งที่แน่นอนได้อย่างไร!
cat
t