Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 是否可以(在有序表中)按顺序查找多行?_Sql_Sql Server_Tsql_Sql Order By_Where - Fatal编程技术网

Sql 是否可以(在有序表中)按顺序查找多行?

Sql 是否可以(在有序表中)按顺序查找多行?,sql,sql-server,tsql,sql-order-by,where,Sql,Sql Server,Tsql,Sql Order By,Where,如果我有一张按ID排序的表,如是: |---------------------|------------------| | ID | Key | |---------------------|------------------| | 1 | Foo | |---------------------|------------------| | 2

如果我有一张按ID排序的表,如是:

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