MS SQL - 按数据范围计算

时间:2016-05-04 14:07:28

标签: sql sql-server

我有一个跨越某些点的飞机飞行轨迹数据的数据库。我正在观察飞机穿过这些点的高度,并试图每隔100英尺将它们装箱。高度范围从大约2000英尺到15000英尺所以我想要一种方法来实现这一点,自动化100英尺的增量。所以我希望有一个交叉点,一个范围(比如2000-2100英尺)和计数。下一行是交叉点,下一个范围(2100-2200英尺)和计数,依此类推。

我仍然是一个SQL新手,所以任何帮助让我指向正确的方向将不胜感激。谢谢。

为了清晰而编辑 - 我什么都没有。我想要一个有我的穿越位置的列,另一个有高度范围,第三个有计数。我只是不确定是否对数据进行分类,因此它会以100英尺的增量给出范围。

2 个答案:

答案 0 :(得分:1)

您可以使用AltitudeBucket的计算列。这是自动计算的。 (此技术通常用于将维度表加载到数据仓库中。)

在这种情况下,将AltitudeBucket作为计算列意味着您可以对其进行计算并在WHERE子句中使用它。

创建并填充表格。

CREATE TABLE dbo.TrackPoint
(
    TrackPointID int NOT NULL IDENTITY(1,1) PRIMARY KEY,
    CrossingPoint nvarchar(50) NOT NULL,
    AltitudeFeet int NOT NULL
        CHECK (AltitudeFeet BETWEEN 1 AND 60000),
    AltitudeBucket AS (AltitudeFeet / 100) * 100 PERSISTED NOT NULL
);
GO

INSERT INTO dbo.TrackPoint (CrossingPoint, AltitudeFeet)
    VALUES
        (N'Paris', 12772),
        (N'Paris', 12765),
        (N'Paris', 32123),
        (N'Toulouse', 5123),
        (N'Toulouse', 6123),
        (N'Toulouse', 6120),
        (N'Lyon', 15000),
        (N'Lyon', 15010);

显示表格中的内容。

SELECT *
    FROM dbo.TrackPoint;

enter image description here

运行SELECT查询以计算汇总计数。

SELECT CrossingPoint, AltitudeBucket, COUNT(*) AS 'Count'
    FROM dbo.TrackPoint
    GROUP BY CrossingPoint, AltitudeBucket
    ORDER BY CrossingPoint, AltitudeBucket;

enter image description here

如果要显示海拔范围。

SELECT CrossingPoint, AltitudeBucket, CAST(AltitudeBucket AS nvarchar) + N'-' + CAST(AltitudeBucket + 99 AS nvarchar) AS 'AltitudeBucketRange', COUNT(*) AS 'Count'
    FROM dbo.TrackPoint
    GROUP BY CrossingPoint, AltitudeBucket
    ORDER BY CrossingPoint, AltitudeBucket;

enter image description here

答案 1 :(得分:-1)

每当您尝试自动执行任何类型的流程时,首先必须为流程设计算法,以便成功执行手动。首先,选择此过程的最小部分:返回范围x和x + 100之间的高度计数。因此,当x = 2000时,您希望返回2000到2100之间的所有记录。

SELECT COUNT(*) FROM AltitudesTable
WHERE altitude >= 2000 AND altitude < 2100;

以上代码适用于一种情况:2000&lt; = x&lt; 2100。 要自动化,&#34;或者遍历所有情况,尝试使用T-SQL:

DECLARE @x INT = 2000;
WHILE EXISTS(SELECT * FROM AltitudesTable)
BEGIN
    SELECT COUNT(*) FROM AltitudesTable
    WHERE altitude >= @x AND altitude < @x+100;
    @x = @x+100;
END

恭敬地,您的要求没有明确定义,所以我不得不对表结构和数据类型做出一些假设。