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”的草书部分。必须是最大值,我认为可以。应该很容易修复。我将更新答案。