【问题标题】:Select current row and all previous rows from a table从表中选择当前行和所有先前行
【发布时间】:2020-05-08 20:45:31
【问题描述】:

举个例子:我有一个名为 mytab 的表,其中包含以下字段:

Name   Age
-----------
Jack    19
Josh    26
David   23

我需要做的是选择这个表的所有行,并且对于每一行,选择它之前的所有行,所以输出应该是:

Name   Age
-----------
Jack    19
Jack    19
Josh    26
Jack    19
Josh    26
David   23

所以查询结果包含第一行,然后是第一行和第二行,然后是第一行、第二行和第三行。

【问题讨论】:

  • SQL 表代表 无序 集合。您的数据没有明显的顺序,因此没有“第一”行。

标签: sql sql-server


【解决方案1】:

表中没有第一行,因为它们代表无序集。您需要一个指定顺序的列。

你真的很奇怪——它可以产生很多行(n * (n + 1) / 2 其中n 是表格的大小)。

但你可以枚举行和自连接:

with tn as (
      select t.*, row_number() over (order by <ordering column>) as seqnum
      from t
     t
select tprev.name, tprev.age
from tn join
     tn tprev
     on tprev.seqnum <= t.seqnum
order by tn.seqnum, tprev.seqnum;

【讨论】:

    【解决方案2】:

    db <> fiddle下方是一种有趣的方法,它可能比在行编号列上自连接更好。

    WITH T AS
    (
    SELECT *,
           ROW_NUMBER() OVER (ORDER BY <ordering column> DESC) AS Weight
    FROM #YourTable yt1
    )
    SELECT Id, Name
    FROM T
    CROSS APPLY (SELECT ROW_NUMBER() OVER (ORDER BY @@SPID) - Weight AS RN FROM STRING_SPLIT(SPACE(Weight - 1), ' ')) CA
    ORDER BY RN,  <ordering column>
    

    【讨论】:

      猜你喜欢
      • 2020-05-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-27
      • 2020-09-23
      • 2022-08-23
      • 2021-03-12
      • 1970-01-01
      相关资源
      最近更新 更多