在SQl服务器中从四分位转义空值

时间:2017-03-06 13:03:01

标签: sql-server

我创建了一个表并插入了一些记录。

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

2 个答案:

答案 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