Where

發生後出現結果的 Where 子句

  • November 11, 2020

我想知道是否有可能找到僅在第一次出現 where 子句之後出現的記錄。我目前在此範例中使用 PostgreSQL,但首選不是 PostgreSQL 特定的東西。

例如,如果我有這樣的表

drop table if exists dummy;
create table dummy (
  col_a   varchar(10),
  col_b   varchar(10),
  col_c   varchar(10),
  test    integer
);

insert into dummy values
('A', 'B', 'C', 1),
('B', 'C', 'A', 2),
('C', 'A', 'B', 3),
('D', 'E', 'F', 4);

如果我執行以下查詢,我可以按新順序獲取數據

select * from dummy
order by col_b;

返回

C | A | B | 3
A | B | C | 1
B | C | A | 2
D | E | F | 4

是否可以做一些事情,以便我只能返回在某個 where 子句之後發生的行,例如

select * from dummy
/* where row appears after results 'A', 'B', 'C', 1 */
order by col_b;

要得到

B | C | A | 2
D | E | F | 4

更新

我不使用的原因where col_b > ?是因為它不適合重複值

在我需要匹配這樣的附加列之前,它會起作用

select * from dummy
where col_b > 'B'
and col_c > 'C'
order by col_b;

在這種情況下,它將返回最後一行,因為這兩個值都高於截止值,但在第一次出現指定行後它沒有截止。

我試圖有一個 where 子句可以辨識特定行是行

A | B | C | 1

在這種情況下

看來您正在尋找這樣的東西:

with cte as 
   (
   select *
       ,row_number() over(order by col_b) as rn
   from dummy
)
select * 
from cte
where rn > (select rn from cte where col_a = 'A' and col_b = 'B' and col_c = 'C' and test = 1 limit 1)

容易地。

WITH cte AS ( SELECT col_a, col_b, col_c, test, 
                    ROW_NUMBER() OVER (ORDER BY col_b) rn
             FROM dummy )
SELECT col_a, col_b, col_c, test
FROM cte
WHERE rn > ( SELECT rn
            FROM cte
            WHERE (col_a, col_b, col_c, test) = ('A', 'B', 'C', 1 ) )
ORDER BY rn;

小提琴

引用自:https://dba.stackexchange.com/questions/279537