【问题标题】:How to get first and Last Record from many interval values in MSSQL如何从 MSSQL 中的许多间隔值中获取第一条和最后一条记录
【发布时间】:2013-03-13 11:07:07
【问题描述】:

我需要为 MSSQL 创建一个查询,以仅获取 MSSQL 表中每个间隔的第一条和最后一条记录。例如我有下表

标识 | label_id

1 | A1

2 | A2

3 | A3

4 | A4

5 | A10

6 | A11

7 | A13

结果必须显示类似

label_id_start | label_id_start |计数

A1         |       A4          |   4
A10        |       A11         |   2
A13        |       A13         |   1

我一直在寻找解决方案,但到目前为止我找不到任何东西,我们将不胜感激。

谢谢

【问题讨论】:

  • 为什么A1 | A2 | 1 不算数?

标签: sql sql-server range intervals min


【解决方案1】:

这样的解决方案可以是一种选择。但请注意, WITH 构造具有递归深度的限制。最大递归大小可以增加 200。OPTION (MAXRECURSION 200)

DECLARE @MyTable TABLE (Iteration INT, Label VARCHAR(50))

INSERT INTO @MyTable(Iteration, Label)
VALUES
    (1, 'A1'),
    (2, 'A2'),
    (3, 'A3'),
    (4, 'A4'),
    (5, 'A10'),
    (6, 'A11'),
    (7, 'A13')

DECLARE @RefinedTable TABLE (LabelId INT, Label VARCHAR(50))

INSERT INTO @RefinedTable(LabelId, Label)
SELECT CAST(REPLACE(Label, 'A', '') AS INT) AS LabelNo, Label 
FROM @MyTable


DECLARE @Queue TABLE (Parent VARCHAR(50), Child VARCHAR(50))

INSERT INTO @Queue(Parent, Child)
SELECT t1.Label, t2.Label
FROM @RefinedTable t1
LEFT OUTER JOIN @RefinedTable t2
    ON t1.LabelId + 1 = t2.LabelId;

WITH Checker(Parent, Child, LastItem, Depth)
AS
(
    SELECT Parent, CAST(NULL AS VARCHAR(50)), Parent, 0  
    FROM @Queue
    WHERE Child IS NULL
    UNION ALL
    SELECT q.Parent, q.Child, c.LastItem, c.Depth + 1
    FROM @Queue q
    INNER JOIN Checker c
        ON c.Parent = q.Child 
)
SELECT 
    'A' + CAST(CAST(REPLACE(LastItem, 'A', '') AS INT) - MAX(Depth) AS VARCHAR) StartLabel,
    LastItem EndLabel,
    COUNT(*) AS [Count] 
FROM Checker
GROUP BY LastItem
ORDER BY 1

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多