你的问题至少有两个问题:
- 您没有提供任何代码来向我们展示您的尝试。有时候自己解决问题真的很好。不过,我发现这个问题很有趣,并决定玩。
- 您的范围块重叠。例如,如果您的列表中有值 621.738,哪个存储桶将包含它? [621.228-621.738] 还是 [621.738-622.248]?
我的回答也至少有三个问题,所以我不希望你接受这个。但是,也许它会让你开始。希望这个免责声明能让我免于被否决。 :-)
- 答案在 T-SQL 中。抱歉,这是我必须处理的。
- 答案不是通用的。它始终创建三个且仅三个存储桶。
- 仅当数据类型将结果限制为小数点后 3 位时才有效。
请记住,这只是一种可能的解决方案,在我看来,这是一个非常薄弱的解决方案。
有了这些免责声明,以下是我写的内容:
SELECT
'[' + STR( RANGES.RANGESTART, 7, 3 )
+ ' - '
+ STR( RANGES.RANGEEND, 7, 3 ) + ']' AS 'BUCKET'
,COUNT(*) AS 'N'
FROM
( SELECT
VALS.MINVAL + (CAST( CNT.INC AS DECIMAL(7,3) ) * VALS.RANGEWIDTH) AS 'RANGESTART'
,CASE WHEN CNT.INC < 2
THEN VALS.MINVAL + (CAST( CNT.INC + 1 AS DECIMAL(7,3) ) * VALS.RANGEWIDTH) - 0.001
ELSE VALS.MINVAL + (CAST( CNT.INC + 1 AS DECIMAL(7,3) ) * VALS.RANGEWIDTH)
END AS 'RANGEEND'
FROM
( SELECT
MIN(CURVAL) AS 'MINVAL'
,MAX(CURVAL) AS 'MAXVAL'
,(MAX(CURVAL) - MIN(CURVAL)) / 3 AS 'RANGEWIDTH'
FROM
MYVALUE ) VALS
CROSS JOIN (VALUES (0), (1), (2) ) CNT(INC)
) RANGES
INNER JOIN MYVALUE V
ON V.CURVAL BETWEEN RANGES.RANGESTART AND RANGES.RANGEEND
GROUP BY
RANGES.RANGESTART
,RANGES.RANGEEND
ORDER BY 1
;
在上面,您的值将位于 MYVALUE 表的 CURVAL 列中。
祝你好运。我希望这对您有所帮助。