Sql 是否可以(在有序表中)按顺序查找多行?
如果我有一张按ID排序的表,如是:Sql 是否可以(在有序表中)按顺序查找多行?,sql,sql-server,tsql,sql-order-by,where,Sql,Sql Server,Tsql,Sql Order By,Where,如果我有一张按ID排序的表,如是: |---------------------|------------------| | ID | Key | |---------------------|------------------| | 1 | Foo | |---------------------|------------------| | 2
|---------------------|------------------|
| ID | Key |
|---------------------|------------------|
| 1 | Foo |
|---------------------|------------------|
| 2 | Bar |
|---------------------|------------------|
| 3 | Test |
|---------------------|------------------|
| 4 | Test |
|---------------------|------------------|
有没有办法检测序列中与where子句匹配的两行
例如,在上面的表中,我想看看是否有任何两行连续具有键“test”
这在SQL中可能吗?您可以使用LEAD window函数,如中所示:
with
x as (
select
id, [key],
lead(id) over(order by id) as next_id,
lead([key]) over(order by id) as next_key
from my_table
)
select id, next_id from x where [key] = 'test' and next_key = 'test'
您可以使用LEAD窗口功能,如中所示:
with
x as (
select
id, [key],
lead(id) over(order by id) as next_id,
lead([key]) over(order by id) as next_key
from my_table
)
select id, next_id from x where [key] = 'test' and next_key = 'test'
另一种选择是间隙和孤岛的变化 范例 返回 编辑-以防ID不连续
另一种选择是间隙和孤岛的变化 范例 返回 编辑-以防ID不连续 您可以尝试使用行数窗口功能检查间隙
SELECT [Key]
FROM (
SELECT *,ROW_NUMBER() OVER(ORDER BY ID) -
ROW_NUMBER() OVER(PARTITION BY [Key] ORDER BY ID) grp
FROM T
)t1
GROUP BY [Key]
HAVING COUNT(grp) = 2
您可以尝试使用行数窗口功能检查间隙
SELECT [Key]
FROM (
SELECT *,ROW_NUMBER() OVER(ORDER BY ID) -
ROW_NUMBER() OVER(PARTITION BY [Key] ORDER BY ID) grp
FROM T
)t1
GROUP BY [Key]
HAVING COUNT(grp) = 2
您可以根据需要进行自联接
CREATE TABLE T(
ID INT,
[Key] VARCHAR(45)
);
INSERT INTO T VALUES
(1, 'Foo'),
(2, 'Bar'),
(3, 'Test'),
(4, 'Test');
SELECT MIN(T1.ID) One,
MAX(T2.ID) Two,
T1.[Key] OnKey
FROM T T1 JOIN T T2
ON T1.[Key] = T2.[Key]
AND
T1.ID <> T2.ID
GROUP BY T1.[Key];
您可以根据需要进行自联接
CREATE TABLE T(
ID INT,
[Key] VARCHAR(45)
);
INSERT INTO T VALUES
(1, 'Foo'),
(2, 'Bar'),
(3, 'Test'),
(4, 'Test');
SELECT MIN(T1.ID) One,
MAX(T2.ID) Two,
T1.[Key] OnKey
FROM T T1 JOIN T T2
ON T1.[Key] = T2.[Key]
AND
T1.ID <> T2.ID
GROUP BY T1.[Key];
您可以进行自连接。a是一个特定的服务器对象,不涉及此问题。我删除了那个标记。你可以进行自连接。a是一个特定的服务器对象,它不涉及这个问题。我去掉了那个标签。
SELECT MIN(T1.ID) One,
MAX(T2.ID) Two,
T1.[Key] OnKey
FROM T T1 CROSS JOIN T T2
WHERE T1.[Key] = T2.[Key]
AND
T1.ID <> T2.ID
GROUP BY T1.[Key]