MS SQL-按数据范围计数

MS SQL-按数据范围计数,sql,sql-server,Sql,Sql Server,我有一个跨越某些点的飞机飞行轨迹数据数据库。我在观察飞机穿过这些点的高度,并试图每100英尺将其装箱。高度范围从2000英尺到15000英尺,所以我想找到一种方法,自动完成100英尺的增量。所以我想要一个交叉点,一个范围(比如说2000-2100英尺)和计数。下一行是交叉点,下一个范围(2100-2200英尺)和计数,依此类推 我还是一个SQL新手,所以如果能帮我找到正确的方向,我将不胜感激。谢谢 为清晰起见进行了编辑-我什么都没有。我想要一列显示我的穿越位置,另一列显示高度范围,第三列显示计数

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

我还是一个SQL新手,所以如果能帮我找到正确的方向,我将不胜感激。谢谢


为清晰起见进行了编辑-我什么都没有。我想要一列显示我的穿越位置,另一列显示高度范围,第三列显示计数。我只是不确定是否要存储这些数据,因此它将以100英尺的增量为我提供范围

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

SELECT COUNT(*) FROM AltitudesTable
WHERE altitude >= 2000 AND altitude < 2100;
从AltitudesTable中选择计数(*)
其中海拔>=2000,海拔<2100;
上述代码适用于一种情况:2000=@x,高度<@x+100; @x=@x+100; 结束
恕我直言,您的需求没有明确定义,因此我不得不对表结构和数据类型做出一些假设。

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

SELECT COUNT(*) FROM AltitudesTable
WHERE altitude >= 2000 AND altitude < 2100;
从AltitudesTable中选择计数(*)
其中海拔>=2000,海拔<2100;
上述代码适用于一种情况:2000=@x,高度<@x+100; @x=@x+100; 结束
恕我直言,您的需求没有明确定义,因此我不得不对表结构和数据类型做出一些假设。

您可以为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;

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

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

如果要显示高度范围

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;

您可以为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;

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

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

如果要显示高度范围

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;

到目前为止,您已经实现了哪些SQL代码?每当涉及到流程自动化时,首先必须了解您的流程是如何手动工作的。请编辑您的问题,以将示例数据包括为DDL+DML和所需结果。您的问题到底是什么?到目前为止,我还没有写任何东西来完成此操作。请提供您的表结构,一些示例数据和预期输出。到目前为止,您实现了哪些SQL代码?每当涉及到流程自动化时,首先必须了解您的流程是如何手动工作的。请编辑您的问题,以将示例数据包括为DDL+DML和所需结果。您的问题到底是什么?到目前为止,我还没有写任何东西来完成此操作。请提供您的表结构,一些示例数据和预期的输出。不使用WHILE或游标进行操作。@mxix此解决方案的功能在于根据需要自动执行OP的任务。坦率地说,如果没有更好的建议,我看不出有什么理由否决这个/提供模棱两可的评论。我洗耳恭听,如果你有一种方法可以在没有光标的情况下或在没有时间的情况下循环并跟踪当前范围。:)这并不含糊。除非必须,否则不要做循环。您有多个选项,一个在问题注释中提到,另一个答案显示了一个示例。或者你也可以用理货表来解决这个问题。不用WHILE或游标就可以了。@mxix这个解决方案的功能在于它可以根据需要自动完成OP的任务。坦率地说,如果没有更好的建议,我看不出有什么理由否决这个/提供模棱两可的评论。我洗耳恭听,如果你有一种方法可以在没有光标的情况下或在没有时间的情况下循环并跟踪当前范围。:)这并不含糊。除非必须,否则不要做循环。您有多个选项,一个在问题注释中提到,另一个答案显示了一个示例。或者你可以用理货台来解决这个问题。