【问题标题】:SQL: Select Row with Last New Sequentially Distinct ValueSQL:选择具有最后一个新的顺序不同值的行
【发布时间】:2019-06-03 13:57:12
【问题描述】:

编辑:请在此处查看更新后的问题:SQL: Select Most Recent Sequentially Distinct Value w/ Grouping

我在编写一个选择最后一个“新”顺序不同值的查询时遇到问题。由于这有点模棱两可,这里有一个例子来解释(假设行号表示顺序;在我的问题中,行是按日期排序的):

|--------|-------|
| RowNum | Col A |
|--------|-------|
| 1      | A     |
| 2      | B     |
| 3      | C     |
| 4      | B     |
| 5      | A     |
| 6      | B     |

会选择:

| 6      | B     |

虽然 B 也出现在第 2 行和第 4 行,但第 5 行包含 A 的事实意味着第 6 行中的 B 是顺序不同的。但是如果表格看起来像这样:

|--------|-------|
| RowNum | Col A |
|--------|-------|
| 1      | A     |
| 2      | B     |
| 3      | C     |
| 4      | B     |
| 5      | A     |
| 6      | A     | <--

然后我们要选择:

| 5      | A     |

如果我不关心值是不同的但不是连续的,我认为这将是一个更容易的问题。我不确定在进行查询时如何考虑顺序。

我试图通过计算每个 Col A 值出现的最小/最大行数来解决这个问题。该计算(使用第二个示例表)将产生如下结果:

|--------|--------|--------|
| ColA   | MinRow | MaxRow |
|--------|--------|--------|
| A      | 1      | 6      |
| B      | 2      | 4      |
| C      | 3      | 3      | 

但是,这是我卡住的地方,因为虽然我可以正确选择 A 作为要使用的值,但我不知道如何使用该表中的其他行来识别我们想要 A 在第 5 行(因为它在 4) 处被 B 打断,而不是第 1 行的 A...

如果可以在 SQL 中完成此问题的任何帮助,将不胜感激。我正在运行 SQL 2008 SP4。

【问题讨论】:

    标签: sql tsql sql-server-2008


    【解决方案1】:

    您可以通过查找您想要的行的前一个 RowNum 作为结果,然后获取下一个 RowNum:

    select top 1 *
    from tablename
    where 
      RowNum > coalesce((
        select max(RowNum) from tablename where colA <> (
          select top 1 colA from tablename order by RowNum desc
        )
      ), 0) 
    order by RowNum
    

    请参阅demo

    【讨论】:

    • 我认为这是一个很好的解决方案,并且总体上运行良好,但是如果表中只有一行,它将不会返回任何内容。我接受了它作为答案,不管 b/c 我想这只是一个我必须事先检查的条件?
    • 现在只用 1 行试试。
    • 是的,现在似乎可以正常工作了。感谢您的帮助。
    • 如果 0 是表中的有效 RowNum,则将 0 替换为 -1。
    • 如果表中的所有 ColA 都相同,它将返回所有行不,它不会。这就是我使用top 1 的原因。它只返回 1 行。请参阅此中的最后一个示例:dbfiddle.uk/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-10-19
    • 2013-02-23
    • 1970-01-01
    • 2013-08-15
    • 1970-01-01
    • 2017-12-07
    • 1970-01-01
    相关资源
    最近更新 更多