SQL查询,根据可变存储桶大小生成值的直方图
我有一个如下所示的值表:SQL查询,根据可变存储桶大小生成值的直方图,sql,sql-server-2012,Sql,Sql Server 2012,我有一个如下所示的值表: voltage 9.7329000 7.6746300 8.5768950 7.9966500 3.5873950 5.6055000 7.5666250 0.6287800 select floor([voltage]/1)*1 as bucket_flr, count(*) as count from [db1].[dbo].[table] group by floor([voltage]/1)*1 order by floor([voltage]/1)*1 我
voltage
9.7329000
7.6746300
8.5768950
7.9966500
3.5873950
5.6055000
7.5666250
0.6287800
select floor([voltage]/1)*1 as bucket_flr, count(*) as count
from [db1].[dbo].[table]
group by floor([voltage]/1)*1
order by floor([voltage]/1)*1
我正在寻找一个SQL查询,为可能变化的bucket大小生成值的直方图。例如,如果桶大小为1.0,则各种计数所属的桶为[0.0,1.0,[1.0,2.0,[2.0,3.0,[3.0,4.0,…。在这种情况下,所示数据的查询结果为:
bucket count
0.0 1
3.0 1
5.0 1
7.0 3
8.0 1
9.0 1
[编辑]到目前为止,我有以下几点:
voltage
9.7329000
7.6746300
8.5768950
7.9966500
3.5873950
5.6055000
7.5666250
0.6287800
select floor([voltage]/1)*1 as bucket_flr, count(*) as count
from [db1].[dbo].[table]
group by floor([voltage]/1)*1
order by floor([voltage]/1)*1
这似乎是可行的,但我想知道是否有更优雅的方法。谢谢!您可以使用递归CTE获取桶限作为结果集:
CREATE TABLE dbo.Voltages (voltage DECIMAL(10, 7))
INSERT INTO dbo.Voltages (voltage)
VALUES
(9.7329000),
(7.6746300),
(8.5768950),
(7.9966500),
(3.5873950),
(5.6055000),
(7.5666250),
(0.6287800)
DECLARE @bucket_size DECIMAL(10, 7) = 1.0
;WITH
CTE_MaxVoltage AS (SELECT MAX(voltage) AS voltage FROM Voltages),
CTE_Buckets AS
(
SELECT
CAST(0.0 AS DECIMAL(10, 7)) AS bucket_start,
CAST(0.0 + @bucket_size AS DECIMAL(10, 7)) AS bucket_end,
1 AS bucket_number
UNION ALL
SELECT
B.bucket_end,
CAST(B.bucket_end + @bucket_size AS DECIMAL(10, 7)),
B.bucket_number + 1
FROM
CTE_Buckets B
INNER JOIN CTE_MaxVoltage MV ON MV.voltage > B.bucket_end
)
SELECT
B.bucket_start AS bucket,
COUNT(*) AS [count]
FROM
CTE_Buckets B
INNER JOIN Voltages V ON
voltage >= B.bucket_start AND
voltage < B.bucket_end
GROUP BY
B.bucket_start
ORDER BY
B.bucket_start
DROP TABLE dbo.Voltages
为了使递归CTE正常工作,我不得不使用CAST。如果您想看到所有的存储桶,甚至是那些测量值为0的存储桶,那么您可以将最后一个连接更改为左外部连接,并使用COUNTV.voltage而不是COUNT*使用我的尝试编辑。我遇到了一个错误:在re中不允许使用GROUP BY、HAVING或AGGRATE函数递归公共表表达式“CTE_bucket”的草书部分。必须是最大值,我认为可以。应该很容易修复。我将更新答案。