Biorąc pod uwagę następną przykładową tabelę:

+-----------+
| Id | Name |  
+----+------+
| 1  | A    |
| 2  | B    |
| 3  | B    |
| 4  | C    |
| 5  | A    |
| 6  | B    |
| 7  | B    |
| 8  | B    |
| 9  | B    |
| 10 | X    |
+----+------+
 

Chciałbym zapytać, aby uzyskać następujący wynik:

+----+------+
| 6  | B    |
| 7  | B    |
| 8  | B    |
| 9  | B    |
+----+------+

Najlepsze zapytanie, które mogłem zrobić, to:

SELECT * FROM 
 (SELECT id, name, LEAD(id) OVER (ORDER BY id) t 
  FROM test WHERE name = 'B' ORDER BY id) 
WHERE ID <> t-1;

Sqlfiddle Oto

1
dellasavia 29 lipiec 2020, 22:10

1 odpowiedź

Najlepsza odpowiedź

Jeśli chcesz długości i gdzie się rozpocznie:

select min(id), max(id)
from (select t.*,
             row_number() over (order by id) as seqnum,
             row_number() over (partition by name order by id) as seqnum_1
      from test t
     ) t
where name = 'B'
group by (seqnum - seqnum_1)
order by min(id) desc
fetch first 1 row only;

Możesz dołączyć do tabeli, aby uzyskać oryginalne wiersze.

Inna metoda przy użyciu funkcji okien do liczby non-bs dany wiersz. . . a następnie wybierz pierwszy:

select t.*
from (select t.*,
             dense_rank() over (order by nonbs_after asc) as grp
      from (select t.*, 
                   sum(case when name <> 'B' then 1 else 0 end) over (order by id desc) as nonbs_after
            from test t
           ) t
      where name = 'B'
     ) t
where grp = 1;

Tutaj jest skrzypcem DB & GT;

1
Gordon Linoff 29 lipiec 2020, 20:56