我创建了一个表并插入了一些记录。
CREATE TABLE #t
(
ID INT IDENTITY(1,1) PRIMARY KEY,
val INT NULL
);
-- INSERT 10 values: 3 NULL, 7 integers
INSERT INTO #t SELECT NULL;
INSERT INTO #t SELECT NULL;
INSERT INTO #t SELECT NULL;
INSERT INTO #t SELECT 5;
INSERT INTO #t SELECT 7;
INSERT INTO #t SELECT 8;
INSERT INTO #t SELECT 9;
INSERT INTO #t SELECT 9;
INSERT INTO #t SELECT 11;
INSERT INTO #t SELECT 12;
现在当我执行脚本来查找四分位
时SELECT *,
NTILE(4) OVER (ORDER BY val) As Q
FROM #t;
我的价值观为
ID val Q
---------
1 NULL 1
2 NULL 1
3 NULL 1
4 5 2
5 7 2
6 8 2
7 9 3
8 9 3
9 11 4
10 12 4
我不想要“Null”记录,也不想使用“Where”子句。 我想要这样的结果
ID val Q
---------
4 5 1
5 7 1
6 8 2
7 9 2
8 9 3
9 11 3
10 12 4
答案 0 :(得分:0)
令我感到震惊的是,您可能需要NULL
NTILE()
值并忽略计算值。你可以这样做:
SELECT t.*,
(CASE WHEN val IS NOT NULL
THEN NTILE(4) OVER (PARTITION BY (CASE WHEN val IS NOT NULL THEN 'NOTNULL' ELSE 'NULL' END)
ORDER BY val
)
END) as Q
FROM #t t;
或者,或许更简单:
SELECT id, val, NTILE(4) OVER (ORDER BY val) As Q
FROM #t t
WHERE val IS NOT NULL
UNION ALL
SELECT id, val, NULL as q
FROM #t t
WHERE val IS NULL;
答案 1 :(得分:0)
您可以尝试以下方法:
SELECT *,
CASE
WHEN val IS NULL THEN NULL
ELSE NTILE(4) OVER (
--Split NULL and NOT NULL into 2 different groups
PARTITION BY CASE WHEN val IS NULL THEN 0 ELSE 1 END
ORDER BY val)
END AS Q
FROM #t
您将获得:
ID val Q
1 NULL NULL
2 NULL NULL
3 NULL NULL
4 5 1
5 7 1
6 8 2
7 9 2
8 9 3
9 11 3
10 12 4