所以我试图在一些客户收到的关注数量上建立分位数,但在应用 NTILES 函数之前,将NULL 和 0 留在样本中并将它们放在 0 和空分位数中,我正在使用这个函数:
CREATE FUNCTION dbo.RPS_Ntiles (@data int,@percentil int)
RETURNS TABLE
AS
RETURN
SELECT
NTILE(@percentil) OVER(ORDER BY @data DESC) as QUINTIL
WHERE @data > 0
UNION
SELECT
CASE
WHEN CONVERT(int,@data) = 0 THEN 0
WHEN @data is NULL THEN NULL
END AS QUINTIL
WHERE @data = 0 or @data = NULL
然后我使用 CROSS APPLY 应用它
SELECT t.QUINTIL,D.[atenciones]
FROM table as D
CROSS APPLY [dbo].[RPS_NTiles](CONVERT(int,D.[atenciones]),5) as t
ORDER BY D.[atenciones] DESC
此查询的结果有效地将 0 和空值保留在 NTILEs 函数之外,但其余数据完全放置在 1 quintil 中,如下所示:
+------------+---------+--+
| Atenciones | Quintil | |
+------------+---------+--+
| 0 | 0 | |
| 0 | 0 | |
| NULL | NULL | |
| 1 | 1 | |
| 3 | 1 | |
| 4 | 1 | |
| 7 | 1 | |
| 46 | 1 | |
| 59 | 1 | |
+------------+---------+--+
我正在寻找这样的东西:
+------------+---------+--+
| Atenciones | Quintil | |
+------------+---------+--+
| 0 | 0 | |
| 0 | 0 | |
| NULL | NULL | |
| 1 | 1 | |
| 3 | 2 | |
| 4 | 2 | |
| 7 | 3 | |
| 46 | 4 | |
| 59 | 5 | |
+------------+---------+--+
为什么要定义自己的函数?您可以使用case
逻辑来表达这一点:
select (case when Atenciones is null or Atenciones = 0
then Atenciones
else ntile(5) over (partition by (case when Atenciones is null or Atenciones = 0 then 1 else 2 end)
order by Atenciones
)
end)
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句