首页 > 解决方案 > SQL:选择具有最后一个新的顺序不同值的行

问题描述

编辑:请在此处查看更新的问题:SQL:选择最近的顺序不同值 w/分组

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

|--------|-------|
| 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。

标签: sqltsqlsql-server-2008

解决方案


您可以通过查找您想要的行的前一个 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

请参阅演示


推荐阅读