我正在使用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;
我想要获取列上最后的非空值,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列(日期,字符串和数字列)以选择最后一个非空值。
任何想法如何进行此选择。
@ypercubeᵀᴹ不,没有缺失的Q4值,这些
—
Edmund
t
值重复出现。它不是行为良好的数据。
好的,但是在那种情况下,您必须提供确定完美订购的订单。
—
ypercubeᵀᴹ
PARTITION BY cat ORDER BY t, id
例如。否则,同一查询(任何查询)在单独执行时可能会给您不同的结果。如果表中的列仅是您显示的列,那么我看不到如何确定订单!
@ypercubeᵀᴹ挑战就在其中。数据中没有id列。有多个分组列,一个可用于组排序的字符串列,然后是多个散有null的值列。
—
Edmund
如果您不能确定地告诉SQL Server行应该是什么顺序,那么该数据的任何使用者如何知道差异?
—
亚伦·伯特兰
cat
排序t
。