SQL:选择具有最后一个新的连续不同值的行

时间:2019-06-03 13:57:12

标签: sql tsql sql-server-2008

编辑:请在此处查看更新的问题: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作为要使用的值,但我不知道如何使用此表中的其他行来识别我们想要第5行中的A(因为它在4)被B中断,而不是第1行中的A ...

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

1 个答案:

答案 0 :(得分:0)

您可以通过找到要作为结果的行的上一个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