sql-server - 如何检查 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 的解决方案。
解决方案
存在:
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
请参阅演示。
推荐阅读
- python - 从数据中去除平均值
- react-native - 如何实现 RAM bundle 和 Inline Requires react native
- c++ - 带有 cmake 的静态库导致链接错误
- while-loop - 检查定时器在 CAPL (CANoe) 中运行时的条件
- google-sheets - 根据 Google 表格中可变数量的子字符串过滤字符串
- javascript - 承诺解决问题
- c - uint vs. unsigned int - 为什么不用 typedef uint?
- node.js - Mongoose 模型方法 - 如果唯一则创建文档
- c++ - boost::multi_index_container MRU
- c# - 使用 xml 进行用户身份验证。C#