当前位置: 首页 > 面试题库 >

从表中选择连续范围

於功
2023-03-14
问题内容

我需要基于连续数字(第N列)和这些数字涉及的相同“类别”(下面的C列)从表中提取连续范围。图形上看起来像这样:

 N  C  D
--------
 1  x  a           C  N1  N2  D1  D2
 2  x  b          ------------------
 3  x  c           x   1   4   a   d     (continuous range with same N)
 4  x  d    ==>    x   6   7   e   f     (new range because "5" is missing)
 6  x  e           y   8  10   g   h     (new range because C changed to "y")
 7  x  f
 8  y  g
 9  y  h
10  y  i

SQL Server是2005。谢谢。


问题答案:
DECLARE @myTable Table
(
    N INT,
    C CHAR(1),
    D CHAR(1)
)
INSERT INTO @myTable(N,C,D) VALUES(1,  'x', 'a');
INSERT INTO @myTable(N,C,D) VALUES(2,  'x', 'b');
INSERT INTO @myTable(N,C,D) VALUES(3,  'x', 'c');
INSERT INTO @myTable(N,C,D) VALUES(4,  'x', 'd');
INSERT INTO @myTable(N,C,D) VALUES(6,  'x', 'e');
INSERT INTO @myTable(N,C,D) VALUES(7,  'x', 'f');
INSERT INTO @myTable(N,C,D) VALUES(8,  'y', 'g');
INSERT INTO @myTable(N,C,D) VALUES(9,  'y', 'h');
INSERT INTO @myTable(N,C,D) VALUES(10, 'y', 'i');


WITH StartingPoints AS(

    SELECT A.*, ROW_NUMBER() OVER(ORDER BY A.N) AS rownum
    FROM @myTable AS A
    WHERE NOT EXISTS(
        SELECT *
        FROM @myTable B
        WHERE B.C = A.C
          AND B.N = A.N - 1
    )
 ),
 EndingPoints AS(
    SELECT A.*, ROW_NUMBER() OVER(ORDER BY A.N) AS rownum
    FROM @myTable AS A
    WHERE NOT EXISTS (
        SELECT *
        FROM @myTable B
        WHERE B.C = A.C
          AND B.N = A.N + 1
    )
 ) 
SELECT StartingPoints.C,
       StartingPoints.N AS [N1],
       EndingPoints.N AS [N2],
       StartingPoints.D AS [D1],
       EndingPoints.D AS [D2] 
FROM StartingPoints
JOIN EndingPoints ON StartingPoints.rownum = EndingPoints.rownum

结果

C    N1          N2          D1   D2
---- ----------- ----------- ---- ----
x    1           4           a    d
x    6           7           e    f
y    8           10          g    i


 类似资料:
  • 我有两个表,我必须根据查询从两个表中选择值 我有两个表,如,每个表都有相同的列。在中,我有额外的列 我必须从性别为男性的tab1和tab2中选择所有值 怎么办? 这是正确的吗?

  • 我的目标是创建一个函数,从给定的IP范围中选择一个IP地址。 目前我正在使用此功能: 我知道此函数只生成IP范围,但是在生成该范围后如何选择IP? 示例:我拥有给定的IP范围93.118.193.0-93.118.193.255。在此范围内,自动获取一个(例如:93.118.193.83)并将其设置为“远程地址”属性。如果已经设置了IP,则随机获取另一个IP(以便两个“远程地址”相同)。 我尝试使

  • 问题内容: 我在MySql 5中有一个电话号码表。简单的结构是 记录如下 我需要对这些数据进行排序,并将连续的数字块分组为数字范围。我愿意在C#LINQ中实现该解决方案,但服务器端MySql是一等奖。MySql中是否有一种方法可以汇总此数据,以便输出如下所示? 问题答案: 有一个简单的技巧可以将连续的条目折叠成一个组。如果按(row_number-entry)进行分组,则连续的条目将在同一组中结束

  • 问题内容: 有没有检查连续日期的功能。我在处理以下问题时遇到问题: 我的表有一个包含以下数据的列: 给定的开始日期为,结束日期为。我想要的结果是: 有人可以建议什么吗? 问题答案: 我认为这是 “连续日期分组岛” 问题的一种变体。可以使用以下方法完成: SQL小提琴 结果 这是SQL Server 2005版本: SQL小提琴

  • 我创建了3个表:Employee、Department和EMPDept。 1)员工表字段为 我不知道在第三个表(即EmpDept)中包括哪些字段,以及如何将join应用于选择列 我的尝试

  • 范围选择器(rangeSelector)是图表中用于选择数据范围的工具,它提供了预配置的时间选择按钮,包括 1天,1周,1个月等,同时也提供时间输入框用于手动指定时间范围。 时间选择按钮 通过 rangeSelector.buttons 可以指定时间选择按钮,默认是 buttons: [{ type: 'month', count: 1, text: '1m' }, {