首页 > 解决方案 > 如何检查 SQL 记录是否按特定顺序

问题描述

我无法弄清楚如何检查表上的记录是否按特定顺序排列。简化的表格设计本质上是这样的:

+------------+----------------+--------+
| ID (GUID)  |   StartDate    | NumCol |
+------------+----------------+--------+
| CEE8C17... | 8/17/2019 3:11 |     22 |
| BB22001... | 8/17/2019 3:33 |     21 |
| 4D40B12... | 8/17/2019 3:47 |     21 |
| 3655125... | 8/17/2019 4:06 |     20 |
| 3456CD1... | 8/17/2019 4:22 |     20 |
| 38BAF92... | 8/17/2019 4:40 |     19 |
| E60CBE8... | 8/17/2019 5:09 |     19 |
| 5F2756B... | 8/17/2019 5:24 |     18 |
+------------+----------------+--------+

ID列是非顺序 GUID。默认情况下,表格按StartDate输入数据的时间排序。但是,我试图标记NumCol值不按降序排列的实例。相邻记录上的NumCol值可以相同,但最终它们必须是降序的。

+--------+
| NumCol |
+--------+
|     22 |
|    *20 | <- I want the ID where this occurs
|     21 |
|     20 |
|     20 |
|     19 |
|     19 |
|     18 |
+--------+

我已经尝试过LEFT JOIN这个表,但似乎无法提出一个ON给出正确结果的子句:

ON a.ID <> b.ID AND a.NumCol > b.NumCol

我还认为我可以OFFSET n ROWS用来将默认排序表与一个ORDER BY NumCol执行的排序表进行比较。我想不出任何可行的方法。

我需要一个适用于 SQL Server 和 SQL Compact 的解决方案。

标签: sql-serversql-server-ce

解决方案


存在:

select t.* from tablename t
where exists (
  select 1 from tablename
  where numcol > t.numcol and startdate > t.startdate
)

或使用 row_number() 窗口函数:

select t.id, t.startdate, t.numcol
from (
  select *,
    row_number() over (order by startdate desc) rn1,
    row_number() over (order by numcol) rn2
  from tablename 
) t
where rn1 > rn2

请参阅演示


推荐阅读