9.26.2018

Oracle 12c versiyasında TopN SQL


Oracle 12c versiyasında Top N Selectlərin tərtibi


Oracle 12c versiyasında SQL –də edilmiş yeniliklərdən biri də Top N selectlərin tərtibindədir.

İzaha keçməzdən əvvəl aşağıda göstərilən cədvəli yaradaq, göstərilən insert əmrlərini yerinə yetirək və izahı həmin cədvəlin üzərində aparaq.



--cədvəlin yaradılması
create table test1(id number, name varchar2(10));

--sətrlərin cədvələ əlavə edilməsi
insert into test1 values(1,'A');
insert into test1 values(2,'B');
insert into test1 values(3,'C');
insert into test1 values(4,'D');
insert into test1 values(4,'E');
insert into test1 values(4,'F');
insert into test1 values(5,'G');
insert into test1 values(6,'H');

12c versiyasına qədər Top N tipli select əmrləri yazmaq üçün inline view istifadə edilirdi.
Məsələn, Test1 cədvəlindən İD üzrə sıralamada ilk 4 (ən kiçik İD-li) sətri çıxaran select əmrini aşağıdakı kimi yaza bilərdik:

--ilk 4 sətri çıxaran sql (12c-dən əvvəlki versiyalarda)
select * from (select * from test1 order by id)
where rownum<=4;

Nəticə:


Oracle 12c versiyasında isə Top N select-lərini yazmaq daha asanlaşdırılıb.
Belə ki, yeni offset N rows, fetch next N rows only, fetch first N rows only, fetch next N percent rows only, fetch first N percent rows only, fetch next N rows with ties, fetch next N percent rows with ties ifadələrini istifadə etməklə daha asan şəkildə Top N selectləri yaza bilərik. Aşağıda hər bir ifadənin mənasını və nümunəsini izləyə bilərik.

    1. offset N rows – müəyyən olunmuş sıralama üzrə N sətirdən sonraki sətirləri çıxarmaq üçün istifadə olunur.

              --ilk 2 sətri nəzərə almamaqla, digər sətrləri çıxaran sql
select * from test1 order by id offset 2 rows;

Nəticə: İD-si 1 və 2 olan (ilk 2) sətirlər çıxmayıb.



     2. fetch next N rows only – müəyyən olunmuş sıralama üzrə ilk N sayda sətirləri çıxarmaq üçün istifadə olunur.

 --ilk 4 sətri çıxaran sql
select * from test1 order by id fetch next 4 rows only; 
Nəticə: İD üzrə sıralama aparılır və yalnız ilk 4 sətr çıxır.

        
Qeyd: next fetch ifadəsini next first ifadəsi ilə əvəz etmək olar. Eyni nəticə çıxaracaq.     
--ilk 4 sətri çıxaran sql
select * from test1 order by id fetch first 4 rows only;
Nəticə: (ilk 4 sətr)



    3.  fetch next N percent rows only - müəyyən olunmuş sıralama üzrə ilk N faiz (ümumi sətr sayına nisbətdə) sayda sətirləri çıxarmaq üçün istifadə olunur.

-- ümumi sətr sayının 25%-i qədər sayda ilk sətrləri çıxarır
select * from test1 order by id fetch next 25 percent rows only;

Nəticə: cədvəldə cəmi 8 sətr, 8-in 25%-i =2 sətr


    4. fetch next N rows with ties – müəyyən olunmuş sıralama üzrə ilk N sayda sətirləri çıxarmaq üçün istifadə olunur. Əgər sonuncu (N-ci) sətrin sıralanma aparılan sütun üzrə təkrarları varsa, sətir sayı N-dən çox ola bilər.

/* ilk 4 sətri çıxaran sql, sıralama aparılan sütuna görə sonuncu sətrin təkrarları varsa,
hamısı çıxacaq, yəni say 4-dən çox da ola bilər */
select * from test1 order by id fetch next 4 rows with ties;

Nəticə: siralama İD sütununa görə təyin olunub (order by İD). İD = 4 olan sətirlər hamsı çıxır. Sətirlərin sayı 4-dən çoxdur (6 sətr)



Mövzuda hər hansı anlaşılmazlıq yaranardığı halda, zəhmət olmasa, fikirlərinizi bölüşəsiniz.


No comments:

Post a Comment