Pencere işlevleri, dinamik olarak tanımlanmış bir veri alt kümesi üzerinde toplama veya diğer hesaplamaları gerçekleştirir; genellikle zaman serisi işleme, sıralama ve hareketli ortalamalar için kullanılır.
Kullanım notları
Pencere işlevleri yalnızca
SELECTifadelerinde yer alabilir.Bir pencere işlevi, diğer pencere işlevleri veya toplama işlevleriyle iç içe kullanılamaz.
Pencere işlevleri, aynı düzeydeki toplama işlevleriyle birlikte kullanılamaz.
Dizin
MaxCompute SQL aşağıdaki pencere işlevlerini destekler.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Pencere işlevi sözdizimi
Pencere işlevi sözdizimi:
<function_name>([distinct][<expression> [, ...]]) over (<window_definition>)
<function_name>([distinct][<expression> [, ...]]) over <window_name>
function_name: Yerleşik bir pencere işlevi, bir toplama işlevi veya bir kullanıcı tanımlı toplama işlevi (UDAF).
expression: İşlevin biçimi; işlevin sözdizimine uygun olmalıdır.
windowing_definition: Pencere tanımı. Sözdizimi hakkında daha fazla bilgi için bkz. windowing_definition.
-
window_name: Pencerenin adı. Özel bir pencere tanımlamak ve windowing_definition öğesine bir ad atamak için
windowanahtar sözcüğünü kullanabilirsiniz. Adlandırılmış pencere tanımının (named_window_def) sözdizimi aşağıdaki gibidir:window <window_name> as (<window_definition>)Aşağıda, özel ifadelerin SQL içindeki konumları açıklanmaktadır:
select ... from ... [where ...] [group by ...] [having ...] named_window_def [order by ...] [limit ...]
windowing_definition
windowing_definition sözdizimi:
--partition_clause:
[partition by <expression> [, ...]]
--orderby_clause:
[order by <expression> [asc|desc][nulls {first|last}] [, ...]]
[<frame_clause>]
Bir SELECT ifadesine pencere işlevi eklediğinizde, veriler pencere tanımındaki partition by ve order by yan tümcelerine göre bölümlenir ve sıralanır. Bir partition by yan tümcesi belirtmezseniz tüm veriler tek bir bölüm olarak kabul edilir. Bir order by yan tümcesi belirtmezseniz bir bölüm içindeki veri sırası garanti edilmez. Geçerli satır olarak adlandırılan her satır için, bu satıra ait pencereyi oluşturmak üzere bölümden frame_clause temel alınarak bir veri segmenti çıkarılır. Ardından pencere işlevi, kendi penceresindeki verilere dayanarak geçerli satır için bir sonuç hesaplar.
partition by <expression> [, ...]: İsteğe bağlıdır. Bölümü belirtir. Aynı bölüm anahtarı sütun değerlerine sahip satırlar aynı bölümde yer alır. Biçim hakkında daha fazla bilgi için bkz. Tablo işlemleri.
-
order by <expression> [asc|desc][nulls {first|last}] [, ...]: İsteğe bağlıdır. Bir bölüm içinde verilerin nasıl sıralanacağını belirtir.
NotSatırlar aynı
order bydeğerlerine sahipse sıralama düzeni garanti edilmez. Tutarlı bir sıra sağlamak içinorder bydeğerlerinin mümkün olduğunca benzersiz olduğundan emin olun. frame_clause: İsteğe bağlıdır. Pencerenin sınırlarını tanımlar. frame_clause hakkında daha fazla bilgi için bkz. frame_clause.
filter_clause
filter_clause sözdizimi:
FILTER (WHERE filter_condition)
filter_condition bir Boole ifadesidir ve bir select ... from ... where ifadesindeki WHERE yan tümcesiyle aynı şekilde kullanılır.
Bir FILTER yan tümcesi sağlarsanız, yalnızca filter_condition koşulunun true olarak değerlendirildiği satırlar pencere çerçevesine dahil edilir. Toplama pencere işlevleri (COUNT, SUM, AVG, MAX ve MIN gibi) için her satır için yine de bir değer döndürülür. Ancak, FILTER ifadesinin true olarak değerlendirilmediği (NULL veya false gibi) satırlar her satırın hesaplaması için pencere çerçevesine dahil edilmez. NULL, false olarak kabul edilir.
Örnek
-
Verileri hazırlayın
-- Create a table. CREATE TABLE IF NOT EXISTS mf_window_fun(key BIGINT,value BIGINT) STORED AS ALIORC; -- Insert data. insert into mf_window_fun values (1,100),(2,200),(1,150),(2,250),(3,300),(4,400),(5,500),(6,600),(7,700); -- Query data from the mf_window_fun table. select * from mf_window_fun; -- The following result is returned: +------------+------------+ | key | value | +------------+------------+ | 1 | 100 | | 2 | 200 | | 1 | 150 | | 2 | 250 | | 3 | 300 | | 4 | 400 | | 5 | 500 | | 6 | 600 | | 7 | 700 | +------------+------------+ -
Pencere içinde değeri 100'den büyük olan satırların kümülatif toplamını sorgulayın.
select key,sum(value) filter(where value > 100) over (partition by key order by key) from mf_window_fun;Aşağıdaki sonuç döndürülür:
+------------+------------+ | key | _c1 | +------------+------------+ | 1 | NULL | -- Skipped | 1 | 150 | | 2 | 200 | | 2 | 450 | | 3 | 300 | | 4 | 400 | | 5 | 500 | | 6 | 600 | | 7 | 700 | +------------+------------+
FILTER yan tümcesi, filter_condition koşulunu karşılamayan satırları sorgu sonucundan kaldırmaz. Yalnızca bunları pencere işlevinin hesaplamasından hariç tutar. Bu satırları nihai çıktıda kaldırmak için bir
select ... from ... whereyan tümcesi kullanmanız gerekir. Hariç tutulan bir satır için pencere işlevinin değeri 0 veya NULL değildir. Bunun yerine, önceki satırdan gelen değeri devralır.FILTER yan tümcesini yalnızca COUNT, SUM, AVG, MAX, MIN ve WM_CONCAT gibi toplama pencere işlevleriyle kullanabilirsiniz. FILTER yan tümcesini RANK, ROW_NUMBER veya NTILE gibi toplamaya dayalı olmayan işlevlerle kullanamazsınız. Aksi takdirde bir sözdizimi hatası oluşur.
Bir pencere işlevinde FILTER sözdizimini kullanmak için aşağıdaki oturum bayrağını etkinleştirmeniz gerekir:
set odps.sql.window.function.newimpl=true;.
frame_clause
frame_clause sözdizimi:
-- Format 1
{ROWS|RANGE|GROUPS} <frame_start> [<frame_exclusion>]
-- Format 2
{ROWS|RANGE|GROUPS} between <frame_start> and <frame_end> [<frame_exclusion>]
frame_clause, pencerenin sınırlarını tanımlayan kapalı bir aralıktır. frame_start ve frame_end konumundaki satırları içerir.
-
ROWS|RANGE|GROUPS: Gereklidir. frame_clause türü. frame_start ve frame_end için uygulama kuralları türe göre değişir.
ROWS: Pencere sınırlarını satır sayısına göre tanımlar.
RANGE: Pencere sınırlarını
order bysütununun değerlerini karşılaştırarak tanımlar. Genellikle pencere tanımında birorder byyan tümcesi belirtilir. Birorder byyan tümcesi belirtilmezse bir bölümdeki tüm satırlar aynıorder bysütun değerine sahip olur. NULL değerler eşit kabul edilir.GROUPS: Aynı
order bysütun değerine sahip bir bölümdeki tüm satırlar bir GROUP (grup) oluşturur. Birorder byyan tümcesi belirtilmezse bölümdeki tüm satırlar tek bir GROUP oluşturur. NULL değerler eşit kabul edilir.
-
frame_start ve frame_end: Pencerenin başlangıç ve bitiş sınırlarını belirtir. frame_start gereklidir. frame_end isteğe bağlıdır. Atlanırsa varsayılan değer CURRENT ROW olur.
frame_start tarafından belirtilen konum, frame_end tarafından belirtilen konumdan önce gelmeli veya frame_end konumuyla eşleşmelidir. Başka bir deyişle, frame_start, frame_end konumuna kıyasla bölümün başına daha yakındır. Bölümün başı, veriler pencere tanımındaki
order byifadesine göre sıralandıktan sonra ilk satırın konumudur. Aşağıdaki tabloda, frame_clause türü ROWS, RANGE veya GROUPS olduğunda frame_start ve frame_end için geçerli değerler ve mantık açıklanmaktadır.frame_clause türü
frame_start/frame_end değeri
Açıklama
ROWS, RANGE, GROUPS
UNBOUNDED PRECEDING
Bölümün ilk satırı. Sayım 1'den başlar.
UNBOUNDED FOLLOWING
Bölümün son satırı.
ROWS
CURRENT ROW
Geçerli satırın konumu. Her veri satırı bir pencere işlevi sonucuna karşılık gelir. Geçerli satır, pencere işlevi sonucunun hesaplandığı satırdır.
offset PRECEDING
Geçerli satırdan, bölümün başına doğru
offsetsatır önceki konum. Örneğin,0 PRECEDINGgeçerli satırı,1 PRECEDINGise önceki satırı ifade eder.offsetnegatif olmayan bir tamsayı olmalıdır.offset FOLLOWING
Geçerli satırdan, bölümün sonuna doğru
offsetsatır sonraki konum. Örneğin,0 FOLLOWINGgeçerli satırı,1 FOLLOWINGise sonraki satırı ifade eder.offsetnegatif olmayan bir tamsayı olmalıdır.RANGE
CURRENT ROW
-
frame_start olarak, geçerli satırla aynı
order bysütun değerine sahip ilk satırın konumunu ifade eder. -
frame_end olarak, geçerli satırla aynı
order bysütun değerine sahip son satırın konumunu ifade eder.
offset PRECEDING
frame_start ve frame_end konumları
order bydizisine bağlıdır. Pencerenin X'e göre sıralandığını varsayalım. Xi, i. satırın X değerini; Xc ise geçerli satırın X değerini temsil eder. Konumlar aşağıdaki gibi açıklanır:-
order byartan düzende olduğunda:-
frame_start:
Xc - Xi <= offsetkoşulunu sağlayan ilk satırın konumu. -
frame_end:
Xc - Xi >= offsetkoşulunu sağlayan son satırın konumu.
-
-
order byazalan düzende olduğunda:-
frame_start:
Xi - Xc <= offsetkoşulunu sağlayan ilk satırın konumu. -
frame_end:
Xi - Xc >= offsetkoşulunu sağlayan son satırın konumu.
-
order bysütunu için desteklenen veri türleri şunlardır: TINYINT, SMALLINT, INT, BIGINT, FLOAT, DOUBLE, DECIMAL, DATETIME, DATE ve TIMESTAMP.Tarih türleri için
offsetsözdizimi aşağıdaki gibidir:-
N: N gün veya N saniyeyi temsil eder. Negatif olmayan bir tamsayı olmalıdır. DATETIME ve TIMESTAMP için N saniyeyi, DATE için N günü temsil eder. -
interval 'N' {YEAR\MONTH\DAY\HOUR\MINUTE\SECOND}: N yıl, ay, gün, saat, dakika veya saniyeyi temsil eder. Örneğin,INTERVAL '3' YEAR3 yılı temsil eder. -
INTERVAL 'N-M' YEAR TO MONTH: N yıl ve M ayı temsil eder. Örneğin,INTERVAL '1-3' YEAR TO MONTH1 yıl ve 3 ayı temsil eder. -
INTERVAL 'D[ H[:M[:S[:N]]]]' DAY TO SECOND: D gün, H saat, M dakika, S saniye ve N nanosaniyeyi temsil eder. Örneğin,INTERVAL '1 2:3:4:5' DAY TO SECOND1 gün, 2 saat, 3 dakika, 4 saniye ve 5 nanosaniyeyi temsil eder.
offset FOLLOWING
frame_start ve frame_end konumları
order bydizisine bağlıdır. Pencerenin X'e göre sıralandığını varsayalım. Xi, i. satırın X değerini; Xc ise geçerli satırın X değerini temsil eder. Konumlar aşağıdaki gibi açıklanır:-
order byartan düzende olduğunda:-
frame_start:
Xi - Xc >= offsetkoşulunu sağlayan ilk satırın konumu. -
frame_end:
Xi - Xc <= offsetkoşulunu sağlayan son satırın konumu.
-
-
order byazalan düzende olduğunda:-
frame_start:
Xc - Xi >= offsetkoşulunu sağlayan ilk satırın konumu. -
frame_end:
Xc - Xi <= offsetkoşulunu sağlayan son satırın konumu.
-
GROUPS
CURRENT ROW
-
frame_start olarak, geçerli satırın ait olduğu GROUP'un ilk satırını ifade eder.
-
frame_end olarak, geçerli satırın ait olduğu GROUP'un son satırını ifade eder.
offset PRECEDING
-
frame_start olarak, geçerli satırın GROUP'undan, bölümün başına doğru
offsetGROUP önceki GROUP'taki ilk satırın konumunu ifade eder. -
frame_end olarak, geçerli satırın GROUP'undan, bölümün başına doğru
offsetGROUP önceki GROUP'taki son satırın konumunu ifade eder.
Notframe_start değerini UNBOUNDED FOLLOWING veya frame_end değerini UNBOUNDED PRECEDING olarak ayarlayamazsınız.
offset FOLLOWING
-
frame_start olarak, geçerli satırın GROUP'undan, bölümün sonuna doğru
offsetGROUP sonraki GROUP'taki ilk satırın konumunu ifade eder. -
frame_end olarak, geçerli satırın GROUP'undan, bölümün sonuna doğru
offsetGROUP sonraki GROUP'taki son satırın konumunu ifade eder.
Notframe_start değerini UNBOUNDED FOLLOWING veya frame_end değerini UNBOUNDED PRECEDING olarak ayarlayamazsınız.
-
-
frame_exclusion: İsteğe bağlıdır. Verilerin bir kısmını pencereden hariç tutmak için kullanılır. Geçerli değerler şunlardır:
EXCLUDE NO OTHERS: Hiçbir veriyi hariç tutmaz.
EXCLUDE CURRENT ROW: Geçerli satırı hariç tutar.
EXCLUDE GROUP: Geçerli satırla aynı
order bydeğerine sahip bölümdeki tüm verileri ifade eden tüm GROUP'u hariç tutar.EXCLUDE TIES: Geçerli satırın kendisi hariç, geçerli satırla aynı order by değerini paylaşan tüm satırları hariç tutar.
Varsayılan frame_clause
Bir frame_clause belirtmezseniz MaxCompute, pencereye dahil edilen verilerin sınırlarını belirlemek için varsayılan bir frame_clause kullanır. Varsayılan frame_clause şöyledir:
-
Hive uyumlu modu etkinleştirildiğinde (
set odps.sql.hive.compatible=true;), varsayılan frame_clause aşağıdaki gibidir ve çoğu diğer SQL sistemiyle aynıdır.RANGE between UNBOUNDED PRECEDING and CURRENT ROW EXCLUDE NO OTHERS -
Hive uyumlu modu devre dışı bırakıldığında (
set odps.sql.hive.compatible=false;), birorder byyan tümcesi belirtilirse ve pencere işlevi AVG, COUNT, MAX, MIN, STDDEV, STDDEV_POP, STDDEV_SAMP veya SUM ise varsayılan frame_clause ROWS türündedir.ROWS between UNBOUNDED PRECEDING and CURRENT ROW EXCLUDE NO OTHERS
Pencere sınırı örnekleri
tbl tablosunun pid: bigint, oid: bigint, rid: bigint yapısına sahip olduğunu ve aşağıdaki verileri içerdiğini varsayalım:
+------------+------------+------------+
| pid | oid | rid |
+------------+------------+------------+
| 1 | NULL | 1 |
| 1 | NULL | 2 |
| 1 | 1 | 3 |
| 1 | 1 | 4 |
| 1 | 2 | 5 |
| 1 | 4 | 6 |
| 1 | 7 | 7 |
| 1 | 11 | 8 |
| 2 | NULL | 9 |
| 2 | NULL | 10 |
+------------+------------+------------+
-
ROW türü pencere
-
Pencere tanımı 1
partition by pid order by oid ROWS between UNBOUNDED PRECEDING and CURRENT ROW --SQL statement is as follows. select pid, oid, rid, collect_list(rid) over(partition by pid order by oid ROWS between UNBOUNDED PRECEDING and CURRENT ROW) as window from tbl;Aşağıdaki sonuç döndürülür:
+------------+------------+------------+--------+ | pid | oid | rid | window | +------------+------------+------------+--------+ | 1 | NULL | 1 | [1] | | 1 | NULL | 2 | [1, 2] | | 1 | 1 | 3 | [1, 2, 3] | | 1 | 1 | 4 | [1, 2, 3, 4] | | 1 | 2 | 5 | [1, 2, 3, 4, 5] | | 1 | 4 | 6 | [1, 2, 3, 4, 5, 6] | | 1 | 7 | 7 | [1, 2, 3, 4, 5, 6, 7] | | 1 | 11 | 8 | [1, 2, 3, 4, 5, 6, 7, 8] | | 2 | NULL | 9 | [9] | | 2 | NULL | 10 | [9, 10] | +------------+------------+------------+--------+ -
Pencere tanımı 2
partition by pid order by oid ROWS between UNBOUNDED PRECEDING and UNBOUNDED FOLLOWING --SQL statement is as follows. select pid, oid, rid, collect_list(rid) over(partition by pid order by oid ROWS between UNBOUNDED PRECEDING and UNBOUNDED FOLLOWING) as window from tbl;Aşağıdaki sonuç döndürülür:
+------------+------------+------------+--------+ | pid | oid | rid | window | +------------+------------+------------+--------+ | 1 | NULL | 1 | [1, 2, 3, 4, 5, 6, 7, 8] | | 1 | NULL | 2 | [1, 2, 3, 4, 5, 6, 7, 8] | | 1 | 1 | 3 | [1, 2, 3, 4, 5, 6, 7, 8] | | 1 | 1 | 4 | [1, 2, 3, 4, 5, 6, 7, 8] | | 1 | 2 | 5 | [1, 2, 3, 4, 5, 6, 7, 8] | | 1 | 4 | 6 | [1, 2, 3, 4, 5, 6, 7, 8] | | 1 | 7 | 7 | [1, 2, 3, 4, 5, 6, 7, 8] | | 1 | 11 | 8 | [1, 2, 3, 4, 5, 6, 7, 8] | | 2 | NULL | 9 | [9, 10] | | 2 | NULL | 10 | [9, 10] | +------------+------------+------------+--------+ -
Pencere tanımı 3
partition by pid order by oid ROWS between 1 FOLLOWING and 3 FOLLOWING --SQL statement is as follows. select pid, oid, rid, collect_list(rid) over(partition by pid order by oid ROWS between 1 FOLLOWING and 3 FOLLOWING) as window from tbl;Aşağıdaki sonuç döndürülür:
+------------+------------+------------+--------+ | pid | oid | rid | window | +------------+------------+------------+--------+ | 1 | NULL | 1 | [2, 3, 4] | | 1 | NULL | 2 | [3, 4, 5] | | 1 | 1 | 3 | [4, 5, 6] | | 1 | 1 | 4 | [5, 6, 7] | | 1 | 2 | 5 | [6, 7, 8] | | 1 | 4 | 6 | [7, 8] | | 1 | 7 | 7 | [8] | | 1 | 11 | 8 | NULL | | 2 | NULL | 9 | [10] | | 2 | NULL | 10 | NULL | +------------+------------+------------+--------+ -
Pencere tanımı 4
partition by pid order by oid ROWS between UNBOUNDED PRECEDING and CURRENT ROW EXCLUDE CURRENT ROW --SQL statement is as follows. select pid, oid, rid, collect_list(rid) over(partition by pid order by oid ROWS between UNBOUNDED PRECEDING and CURRENT ROW EXCLUDE CURRENT ROW) as window from tbl;Aşağıdaki sonuç döndürülür:
+------------+------------+------------+--------+ | pid | oid | rid | window | +------------+------------+------------+--------+ | 1 | NULL | 1 | NULL | | 1 | NULL | 2 | [1] | | 1 | 1 | 3 | [1, 2] | | 1 | 1 | 4 | [1, 2, 3] | | 1 | 2 | 5 | [1, 2, 3, 4] | | 1 | 4 | 6 | [1, 2, 3, 4, 5] | | 1 | 7 | 7 | [1, 2, 3, 4, 5, 6] | | 1 | 11 | 8 | [1, 2, 3, 4, 5, 6, 7] | | 2 | NULL | 9 | NULL | | 2 | NULL | 10 | [9] | +------------+------------+------------+--------+ -
Pencere tanımı 5
partition by pid order by oid ROWS between UNBOUNDED PRECEDING and CURRENT ROW EXCLUDE GROUP --SQL statement is as follows. select pid, oid, rid, collect_list(rid) over(partition by pid order by oid ROWS between UNBOUNDED PRECEDING and CURRENT ROW EXCLUDE GROUP) as window from tbl;Aşağıdaki sonuç döndürülür:
+------------+------------+------------+--------+ | pid | oid | rid | window | +------------+------------+------------+--------+ | 1 | NULL | 1 | NULL | | 1 | NULL | 2 | NULL | | 1 | 1 | 3 | [1, 2] | | 1 | 1 | 4 | [1, 2] | | 1 | 2 | 5 | [1, 2, 3, 4] | | 1 | 4 | 6 | [1, 2, 3, 4, 5] | | 1 | 7 | 7 | [1, 2, 3, 4, 5, 6] | | 1 | 11 | 8 | [1, 2, 3, 4, 5, 6, 7] | | 2 | NULL | 9 | NULL | | 2 | NULL | 10 | NULL | +------------+------------+------------+--------+ -
Pencere tanımı 6
partition by pid order by oid ROWS between UNBOUNDED PRECEDING and CURRENT ROW EXCLUDE TIES --SQL statement is as follows. select pid, oid, rid, collect_list(rid) over(partition by pid order by oid ROWS between UNBOUNDED PRECEDING and CURRENT ROW EXCLUDE TIES) as window from tbl;Aşağıdaki sonuç döndürülür:
+------------+------------+------------+--------+ | pid | oid | rid | window | +------------+------------+------------+--------+ | 1 | NULL | 1 | [1] | | 1 | NULL | 2 | [2] | | 1 | 1 | 3 | [1, 2, 3] | | 1 | 1 | 4 | [1, 2, 4] | | 1 | 2 | 5 | [1, 2, 3, 4, 5] | | 1 | 4 | 6 | [1, 2, 3, 4, 5, 6] | | 1 | 7 | 7 | [1, 2, 3, 4, 5, 6, 7] | | 1 | 11 | 8 | [1, 2, 3, 4, 5, 6, 7, 8] | | 2 | NULL | 9 | [9] | | 2 | NULL | 10 | [10] | +------------+------------+------------+--------+Bu örnekte ve önceki örnekte
riddeğeri 2, 4 ve 10 olan satırlar içinwindowsonuçlarını karşılaştırarak EXCLUDE CURRENT ROW ile EXCLUDE GROUP arasındaki farkı gözlemleyebilirsiniz. EXCLUDE GROUP kullanıldığında, aynı bölümde (piddeğerinin eşit olduğu durumlarda), geçerli satırla aynıoiddeğerine sahip tüm veriler dışlanır.
-
-
RANGE türü pencere
-
Pencere tanımı 1
partition by pid order by oid RANGE between UNBOUNDED PRECEDING and CURRENT ROW --SQL statement is as follows. select pid, oid, rid, collect_list(rid) over(partition by pid order by oid RANGE between UNBOUNDED PRECEDING and CURRENT ROW) as window from tbl;Aşağıdaki sonuç döndürülür:
+------------+------------+------------+--------+ | pid | oid | rid | window | +------------+------------+------------+--------+ | 1 | NULL | 1 | [1, 2] | | 1 | NULL | 2 | [1, 2] | | 1 | 1 | 3 | [1, 2, 3, 4] | | 1 | 1 | 4 | [1, 2, 3, 4] | | 1 | 2 | 5 | [1, 2, 3, 4, 5] | | 1 | 4 | 6 | [1, 2, 3, 4, 5, 6] | | 1 | 7 | 7 | [1, 2, 3, 4, 5, 6, 7] | | 1 | 11 | 8 | [1, 2, 3, 4, 5, 6, 7, 8] | | 2 | NULL | 9 | [9, 10] | | 2 | NULL | 10 | [9, 10] | +------------+------------+------------+--------+CURRENT ROW, frame_end olarak kullanıldığında, geçerli satırla aynı
order bydeğerine (oid) sahip son satıra kadar olan tüm satırları kapsar. Bu nedenle,riddeğeri 1 olan kayıt içinwindowsonucu [1, 2] olarak döner. -
Pencere tanımı 2
partition by pid order by oid RANGE between CURRENT ROW and UNBOUNDED FOLLOWING --SQL statement is as follows. select pid, oid, rid, collect_list(rid) over(partition by pid order by oid RANGE between CURRENT ROW and UNBOUNDED FOLLOWING) as window from tbl;Aşağıdaki sonuç döndürülür:
+------------+------------+------------+--------+ | pid | oid | rid | window | +------------+------------+------------+--------+ | 1 | NULL | 1 | [1, 2, 3, 4, 5, 6, 7, 8] | | 1 | NULL | 2 | [1, 2, 3, 4, 5, 6, 7, 8] | | 1 | 1 | 3 | [3, 4, 5, 6, 7, 8] | | 1 | 1 | 4 | [3, 4, 5, 6, 7, 8] | | 1 | 2 | 5 | [5, 6, 7, 8] | | 1 | 4 | 6 | [6, 7, 8] | | 1 | 7 | 7 | [7, 8] | | 1 | 11 | 8 | [8] | | 2 | NULL | 9 | [9, 10] | | 2 | NULL | 10 | [9, 10] | +------------+------------+------------+--------+ -
Pencere tanımı 3
partition by pid order by oid RANGE between 3 PRECEDING and 1 PRECEDING --SQL statement is as follows. select pid, oid, rid, collect_list(rid) over(partition by pid order by oid RANGE between 3 PRECEDING and 1 PRECEDING) as window from tbl;Aşağıdaki sonuç döndürülür:
+------------+------------+------------+--------+ | pid | oid | rid | window | +------------+------------+------------+--------+ | 1 | NULL | 1 | [1, 2] | | 1 | NULL | 2 | [1, 2] | | 1 | 1 | 3 | NULL | | 1 | 1 | 4 | NULL | | 1 | 2 | 5 | [3, 4] | | 1 | 4 | 6 | [3, 4, 5] | | 1 | 7 | 7 | [6] | | 1 | 11 | 8 | NULL | | 2 | NULL | 9 | [9, 10] | | 2 | NULL | 10 | [9, 10] | +------------+------------+------------+--------+order bydeğeri (oid) NULL olan satırlar için,offset {PRECEDING|FOLLOWING}kullanıldığında veoffsetdeğeri UNBOUNDED olmadığında sınır aşağıdaki şekilde belirlenir: frame_start olarak kullanıldığında, bölümdeki NULLorder bydeğerine sahip ilk satırı işaret eder. frame_end olarak kullanıldığında ise NULLorder bydeğerine sahip son satırı işaret eder.
-
-
GROUPS türü pencere
Pencere tanımı aşağıdaki gibidir:
partition by pid order by oid GROUPS between 2 PRECEDING and CURRENT ROW --SQL statement is as follows. select pid, oid, rid, collect_list(rid) over(partition by pid order by oid GROUPS between 2 PRECEDING and CURRENT ROW) as window from tbl;Aşağıdaki sonuç döndürülür:
+------------+------------+------------+--------+ | pid | oid | rid | window | +------------+------------+------------+--------+ | 1 | NULL | 1 | [1, 2] | | 1 | NULL | 2 | [1, 2] | | 1 | 1 | 3 | [1, 2, 3, 4] | | 1 | 1 | 4 | [1, 2, 3, 4] | | 1 | 2 | 5 | [1, 2, 3, 4, 5] | | 1 | 4 | 6 | [3, 4, 5, 6] | | 1 | 7 | 7 | [5, 6, 7] | | 1 | 11 | 8 | [6, 7, 8] | | 2 | NULL | 9 | [9, 10] | | 2 | NULL | 10 | [9, 10] | +------------+------------+------------+--------+
Örnek veriler
Aşağıdaki örneklerde bu örnek veriler kullanılmaktadır. emp tablosunu oluşturun ve doldurun:
create table if not exists emp
(empno bigint,
ename string,
job string,
mgr bigint,
hiredate datetime,
sal bigint,
comm bigint,
deptno bigint);
tunnel upload emp.txt emp;
emp.txt dosyası aşağıdaki verileri içerir:
7369,SMITH,CLERK,7902,1980-12-17 00:00:00,800,,20
7499,ALLEN,SALESMAN,7698,1981-02-20 00:00:00,1600,300,30
7521,WARD,SALESMAN,7698,1981-02-22 00:00:00,1250,500,30
7566,JONES,MANAGER,7839,1981-04-02 00:00:00,2975,,20
7654,MARTIN,SALESMAN,7698,1981-09-28 00:00:00,1250,1400,30
7698,BLAKE,MANAGER,7839,1981-05-01 00:00:00,2850,,30
7782,CLARK,MANAGER,7839,1981-06-09 00:00:00,2450,,10
7788,SCOTT,ANALYST,7566,1987-04-19 00:00:00,3000,,20
7839,KING,PRESIDENT,,1981-11-17 00:00:00,5000,,10
7844,TURNER,SALESMAN,7698,1981-09-08 00:00:00,1500,0,30
7876,ADAMS,CLERK,7788,1987-05-23 00:00:00,1100,,20
7900,JAMES,CLERK,7698,1981-12-03 00:00:00,950,,30
7902,FORD,ANALYST,7566,1981-12-03 00:00:00,3000,,20
7934,MILLER,CLERK,7782,1982-01-23 00:00:00,1300,,10
7948,JACCKA,CLERK,7782,1981-04-12 00:00:00,5000,,10
7956,WELAN,CLERK,7649,1982-07-20 00:00:00,2450,,10
7956,TEBAGE,CLERK,7748,1982-12-30 00:00:00,1300,,10
AVG
-
Sözdizimi
double avg([distinct] double <expr>) over ([partition_clause] [orderby_clause] [frame_clause]) decimal avg([distinct] decimal <expr>) over ([partition_clause] [orderby_clause] [frame_clause]) -
Açıklama
Bir pencere içindeki expr ifadesinin ortalama değerini döndürür.
-
Parametreler
-
expr: Zorunludur. Sonucu hesaplanacak ifadedir. DOUBLE veya DECIMAL türünde olmalıdır.
Giriş değeri STRING veya BIGINT türündeyse hesaplama için örtük olarak DOUBLE türüne dönüştürülür. Diğer veri türleri için hata döndürülür.
Giriş değeri NULL ise satır hesaplamaya dahil edilmez.
distinct anahtar sözcüğünü belirtirseniz işlev benzersiz değerlerin ortalamasını hesaplar.
partition_clause, orderby_clause ve frame_clause: Daha fazla bilgi için bkz. pencerleme_tanımı.
-
-
Dönüş değeri
expr DECIMAL türündeyse DECIMAL değeri, aksi takdirde DOUBLE değeri döndürülür. expr değerlerinin tümü NULL ise NULL döndürülür.
-
Örnekler
-
Örnek 1: Departmana (deptno) göre bölümlendirin ve sıralama olmadan ortalama maaşı (sal) hesaplayın. İşlev, tüm bölüm için (aynı deptno değerine sahip tüm satırlar) ortalama maaşı hesaplar. Komut aşağıdaki gibidir:
select deptno, sal, avg(sal) over (partition by deptno) from emp;Aşağıdaki sonuç döndürülür:
+------------+------------+------------+ | deptno | sal | _c2 | +------------+------------+------------+ | 10 | 1300 | 2916.6666666666665 | -- This is the first row of the window. The value is the cumulative average from the first to the sixth row. | 10 | 2450 | 2916.6666666666665 | -- The value is the cumulative average from the first to the sixth row. | 10 | 5000 | 2916.6666666666665 | -- The value is the cumulative average from the first to the sixth row. | 10 | 1300 | 2916.6666666666665 | | 10 | 5000 | 2916.6666666666665 | | 10 | 2450 | 2916.6666666666665 | | 20 | 3000 | 2175.0 | | 20 | 3000 | 2175.0 | | 20 | 800 | 2175.0 | | 20 | 1100 | 2175.0 | | 20 | 2975 | 2175.0 | | 30 | 1500 | 1566.6666666666667 | | 30 | 950 | 1566.6666666666667 | | 30 | 1600 | 1566.6666666666667 | | 30 | 1250 | 1566.6666666666667 | | 30 | 1250 | 1566.6666666666667 | | 30 | 2850 | 1566.6666666666667 | +------------+------------+------------+ -
Örnek 2: Hive uyumlu olmayan modda departmana (deptno) göre bölümlendirin, maaşa (sal) göre sıralayın ve ortalama maaşı hesaplayın. İşlev, bölümün ilk satırından geçerli satıra kadar olan çalışan sayısı için bir hareketli ortalama hesaplar. Komutlar aşağıdaki gibidir:
-- Disable Hive compatible mode. set odps.sql.hive.compatible=false; -- Execute the following SQL command. select deptno, sal, avg(sal) over (partition by deptno order by sal) from emp;Aşağıdaki sonuç döndürülür:
+------------+------------+------------+ | deptno | sal | _c2 | +------------+------------+------------+ | 10 | 1300 | 1300.0 | -- First row of the window. | 10 | 1300 | 1300.0 | -- Cumulative average from the first to the second row. | 10 | 2450 | 1683.3333333333333 | -- Cumulative average from the first to the third row. | 10 | 2450 | 1875.0 | -- Cumulative average from the first to the fourth row. | 10 | 5000 | 2500.0 | -- Cumulative average from the first to the fifth row. | 10 | 5000 | 2916.6666666666665 | -- Cumulative average from the first to the sixth row. | 20 | 800 | 800.0 | | 20 | 1100 | 950.0 | | 20 | 2975 | 1625.0 | | 20 | 3000 | 1968.75 | | 20 | 3000 | 2175.0 | | 30 | 950 | 950.0 | | 30 | 1250 | 1100.0 | | 30 | 1250 | 1150.0 | | 30 | 1500 | 1237.5 | | 30 | 1600 | 1310.0 | | 30 | 2850 | 1566.6666666666667 | +------------+------------+------------+ -
Örnek 3: Hive uyumlu modda departmana (deptno) göre bölümlendirin, maaşa (sal) göre sıralayın ve ortalama maaşı hesaplayın. İşlev, bölümün ilk satırından geçerli satırın son eş değerine (aynı sal değerine sahip satırlar aynı ortalamaya sahiptir) kadar olan çalışan sayısı için bir hareketli ortalama hesaplar. Komutlar aşağıdaki gibidir:
-- Enable Hive compatible mode. set odps.sql.hive.compatible=true; -- Execute the following SQL command. select deptno, sal, avg(sal) over (partition by deptno order by sal) from emp;Aşağıdaki sonuç döndürülür:
+------------+------------+------------+ | deptno | sal | _c2 | +------------+------------+------------+ | 10 | 1300 | 1300.0 | -- First row of the window. Since the sal of the first and second rows are the same, the average for the first row is the cumulative average of the first two rows. | 10 | 1300 | 1300.0 | -- Cumulative average from the first to the second row. | 10 | 2450 | 1875.0 | -- Since the sal of the third and fourth rows are the same, the average for the third row is the cumulative average of the first four rows. | 10 | 2450 | 1875.0 | -- Cumulative average from the first to the fourth row. | 10 | 5000 | 2916.6666666666665 | | 10 | 5000 | 2916.6666666666665 | | 20 | 800 | 800.0 | | 20 | 1100 | 950.0 | | 20 | 2975 | 1625.0 | | 20 | 3000 | 2175.0 | | 20 | 3000 | 2175.0 | | 30 | 950 | 950.0 | | 30 | 1250 | 1150.0 | | 30 | 1250 | 1150.0 | | 30 | 1500 | 1237.5 | | 30 | 1600 | 1310.0 | | 30 | 2850 | 1566.6666666666667 | +------------+------------+------------+
-
CLUSTER_SAMPLE
-
Sözdizimi
boolean cluster_sample(bigint <N>) OVER ([partition_clause]) boolean cluster_sample(bigint <N>, bigint <M>) OVER ([partition_clause]) -
Açıklama
cluster_sample(bigint <N>): Bölümden rastgele N satır örnekler.cluster_sample(bigint <N>, bigint <M>): Bölümden satırların bir kesrini (M/N) rastgele örnekler. Örneklelenen satır sayısı yaklaşık olarakpartition_row_count × M / Nkadardır; buradapartition_row_countbölümdeki satır sayısını ifade eder.
-
Parametreler
N: Zorunludur. BIGINT sabitidir. N NULL ise dönüş değeri NULL olur.
M: Zorunludur. BIGINT sabitidir. M NULL ise dönüş değeri NULL olur.
partition_clause: İsteğe bağlıdır. Daha fazla bilgi için bkz. pencerleme_tanımı.
-
Dönüş değeri
BOOLEAN değeri döndürür.
-
Örnek
Her gruptan satırların yaklaşık %20'sini örneklemek için aşağıdaki komutu kullanın:
select deptno, sal from ( select deptno, sal, cluster_sample(5, 1) over (partition by deptno) as flag from emp ) sub where flag = true;Aşağıdaki sonuç döndürülür:
+------------+------------+ | deptno | sal | +------------+------------+ | 10 | 1300 | | 20 | 3000 | | 30 | 950 | +------------+------------+
COUNT
Sözdizimi
-- Count the number of records.
BIGINT COUNT([DISTINCT|ALL] <colname>)
-- Count the number of records in the window.
BIGINT COUNT(*) OVER ([partition_clause] [orderby_clause] [frame_clause])
BIGINT COUNT([DISTINCT] <expr>[,...]) OVER ([partition_clause] [orderby_clause] [frame_clause])
Parametreler
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Dönüş değeri
BIGINT döndürür. COUNT(*) kullanmadığınız sürece NULL satırlar hariç tutulur.
Örnekler
Test verilerini hazırlayın
Verileriniz zaten varsa bu adımı atlayabilirsiniz.
Test verilerini test_data.txt indirin.
-
Bir test tablosu oluşturun.
CREATE TABLE IF NOT EXISTS emp( empno BIGINT, ename STRING, job STRING, mgr BIGINT, hiredate DATETIME, sal BIGINT, comm BIGINT, deptno BIGINT ); -
Verileri yükleyin.
FILE_PATHyerine veri dosyanızın gerçek yolunu ve adını yazın.TUNNEL UPLOAD {{FILEPATH}} emp;
Örnek 1: Sıralama olmadan pencereyi bölümlendirme
Pencereyi sal ile bölümlendirin. ORDER BY olmadan her satır, kendi bölümündeki toplam satır sayısını döndürür.
SELECT sal, COUNT(sal) OVER (PARTITION BY sal) AS count
FROM emp;
Sonuç:
+------------+------------+
| sal | count |
+------------+------------+
| 800 | 1 |
| 950 | 1 |
| 1100 | 1 |
| 1250 | 2 | -- Two rows share sal=1250; both return 2.
| 1250 | 2 |
| 1300 | 2 |
| 1300 | 2 |
| 1500 | 1 |
| 1600 | 1 |
| 2450 | 2 |
| 2450 | 2 |
| 2850 | 1 |
| 2975 | 1 |
| 3000 | 2 |
| 3000 | 2 |
| 5000 | 2 |
| 5000 | 2 |
+------------+------------+
Örnek 2: Sıralama ile pencereyi bölümlendirme (Hive uyumlu olmayan mod)
Hive uyumlu olmayan modda ORDER BY eklemek bir hareketli sayım üretir. Her satır, bölümündeki ilk satırdan geçerli satıra kadar olan kümülatif sayımı döndürür.
-- Disable Hive compatible mode.
SET odps.sql.hive.compatible=false;
SELECT sal, COUNT(sal) OVER (PARTITION BY sal ORDER BY sal) AS count
FROM emp;
Sonuç:
+------------+------------+
| sal | count |
+------------+------------+
| 800 | 1 |
| 950 | 1 |
| 1100 | 1 |
| 1250 | 1 | -- Running count starts at 1 for the first row in the partition.
| 1250 | 2 | -- Increments to 2 for the second row.
| 1300 | 1 |
| 1300 | 2 |
| 1500 | 1 |
| 1600 | 1 |
| 2450 | 1 |
| 2450 | 2 |
| 2850 | 1 |
| 2975 | 1 |
| 3000 | 1 |
| 3000 | 2 |
| 5000 | 1 |
| 5000 | 2 |
+------------+------------+
Örnek 3: Sıralama ile pencereyi bölümlendirme (Hive uyumlu mod)
Hive uyumlu modda ORDER BY hareketli sayım üretmez. Bölümdeki her satır, ORDER BY öğesini atlamakla aynı şekilde toplam bölüm sayısını döndürür.
-- Enable Hive compatible mode.
SET odps.sql.hive.compatible=true;
SELECT sal, COUNT(sal) OVER (PARTITION BY sal ORDER BY sal) AS count
FROM emp;
Sonuç:
+------------+------------+
| sal | count |
+------------+------------+
| 800 | 1 |
| 950 | 1 |
| 1100 | 1 |
| 1250 | 2 | -- Both rows in the partition return the full partition count.
| 1250 | 2 |
| 1300 | 2 |
| 1300 | 2 |
| 1500 | 1 |
| 1600 | 1 |
| 2450 | 2 |
| 2450 | 2 |
| 2850 | 1 |
| 2975 | 1 |
| 3000 | 2 |
| 3000 | 2 |
| 5000 | 2 |
| 5000 | 2 |
+------------+------------+
Örnek 4: Bir tablodaki tüm satırları sayma
SELECT COUNT(*) FROM emp;
Sonuç:
+------------+
| _c0 |
+------------+
| 17 |
+------------+
Örnek 5: Grup başına satır sayma
Departman başına çalışan sayısını almak için GROUP BY ile COUNT kullanın.
SELECT deptno, COUNT(*) FROM emp GROUP BY deptno;
Sonuç:
+------------+------------+
| deptno | _c1 |
+------------+------------+
| 20 | 5 |
| 30 | 6 |
| 10 | 6 |
+------------+------------+
Örnek 6: Benzersiz değerleri sayma
Farklı departmanların sayısını hesaplamak için DISTINCT kullanın.
SELECT COUNT(DISTINCT deptno) FROM emp;
Sonuç:
+------------+
| _c0 |
+------------+
| 3 |
+------------+
CUME_DIST
-
Sözdizimi
double cume_dist() over([partition_clause] [orderby_clause]) -
Açıklama
Bir değer grubu içindeki bir değerin kümülatif dağılımını hesaplar. Sonuç, değeri geçerli satırın değerinden küçük veya ona eşit olan satır sayısının, bölümdeki toplam satır sayısına bölünmesiyle elde edilir. Karşılaştırma, orderby_clause tarafından belirlenir.
-
Parametreler
partition_clause ve orderby_clause: Daha fazla bilgi için bkz. pencerleme_tanımı.
-
Dönüş değeri
DOUBLE değeri döndürür. Belirli dönüş değeri
row_number_of_last_peer / partition_row_countdeğerine eşittir; buradarow_number_of_last_peergeçerli satırın GRUBU'nun son satırı için ROW_NUMBER pencere işlevinin dönüş değeridir vepartition_row_countsatırın ait olduğu bölümdeki satır sayısıdır. -
Örnek
Departmana (deptno) göre bölümlendirin ve her departman içindeki maaşın (sal) kümülatif dağılımını hesaplayın. Komut aşağıdaki gibidir:
select deptno, ename, sal, concat(round(cume_dist() over (partition by deptno order by sal desc)*100,2),'%') as cume_dist from emp;Aşağıdaki sonuç döndürülür:
+------------+------------+------------+------------+ | deptno | ename | sal | cume_dist | +------------+------------+------------+------------+ | 10 | JACCKA | 5000 | 33.33% | | 10 | KING | 5000 | 33.33% | | 10 | CLARK | 2450 | 66.67% | | 10 | WELAN | 2450 | 66.67% | | 10 | TEBAGE | 1300 | 100.0% | | 10 | MILLER | 1300 | 100.0% | | 20 | SCOTT | 3000 | 40.0% | | 20 | FORD | 3000 | 40.0% | | 20 | JONES | 2975 | 60.0% | | 20 | ADAMS | 1100 | 80.0% | | 20 | SMITH | 800 | 100.0% | | 30 | BLAKE | 2850 | 16.67% | | 30 | ALLEN | 1600 | 33.33% | | 30 | TURNER | 1500 | 50.0% | | 30 | MARTIN | 1250 | 83.33% | | 30 | WARD | 1250 | 83.33% | | 30 | JAMES | 950 | 100.0% | +------------+------------+------------+------------+
DENSE_RANK
-
Sözdizimi
bigint dense_rank() over ([partition_clause] [orderby_clause]) -
Açıklama
orderby_clause içinde belirtilen sıralama düzenine göre geçerli satırın bölüm içindeki sırasını hesaplar. Sıralama 1'den başlar. Bir bölümde aynı
order bydeğerlerine sahip satırlara aynı sıra atanır.order bydeğeri her değiştiğinde sıra 1 artar. -
Parametreler
partition_clause ve orderby_clause: Daha fazla bilgi için bkz. pencerleme_tanımı.
-
Dönüş değeri
BIGINT değeri döndürür. orderby_clause belirtilmezse tüm satırlar 1 sırası alır.
-
Örnek
Departmana (deptno) göre bölümlendirin ve çalışanları her departman içinde maaşlarına (sal) göre azalan sırada sıralayın. Komut aşağıdaki gibidir:
select deptno, ename, sal, dense_rank() over (partition by deptno order by sal desc) as nums from emp;Aşağıdaki sonuç döndürülür:
+------------+------------+------------+------------+ | deptno | ename | sal | nums | +------------+------------+------------+------------+ | 10 | JACCKA | 5000 | 1 | | 10 | KING | 5000 | 1 | | 10 | CLARK | 2450 | 2 | | 10 | WELAN | 2450 | 2 | | 10 | TEBAGE | 1300 | 3 | | 10 | MILLER | 1300 | 3 | | 20 | SCOTT | 3000 | 1 | | 20 | FORD | 3000 | 1 | | 20 | JONES | 2975 | 2 | | 20 | ADAMS | 1100 | 3 | | 20 | SMITH | 800 | 4 | | 30 | BLAKE | 2850 | 1 | | 30 | ALLEN | 1600 | 2 | | 30 | TURNER | 1500 | 3 | | 30 | MARTIN | 1250 | 4 | | 30 | WARD | 1250 | 4 | | 30 | JAMES | 950 | 5 | +------------+------------+------------+------------+
FIRST_VALUE
-
Sözdizimi
first_value(<expr>[, <ignore_nulls>]) over ([partition_clause] [orderby_clause] [frame_clause]) -
Açıklama
Pencere çerçevesinin ilk satırındaki expr ifadesinin değerini döndürür.
-
Parametreler
expr: Zorunludur. Sonucunu hesaplamak istediğiniz ifade.
ignore_nulls: İsteğe bağlıdır. NULL değerlerin yoksayılıp yoksayılmayacağını belirten bir BOOLEAN değeridir. Varsayılan değer False'tur. Bu parametre True olarak ayarlandığında, işlev pencere çerçevesindeki expr ifadesinin ilk NULL olmayan değerini döndürür.
partition_clause, orderby_clause ve frame_clause: Daha fazla bilgi için bkz. windowing_definition.
-
Dönüş değeri
Dönüş değeri, expr ile aynı veri türüne sahiptir.
-
Örnek
Aşağıdaki komut, tüm çalışanları departmana göre gruplar ve her gruptan ilk veri satırını döndürür:
-
order by belirtilmemiş durumda:
select deptno, ename, sal, first_value(sal) over (partition by deptno) as first_value from emp;Aşağıdaki sonuç döndürülür:
+------------+------------+------------+-------------+ | deptno | ename | sal | first_value | +------------+------------+------------+-------------+ | 10 | TEBAGE | 1300 | 1300 | -- First row of the current window. | 10 | CLARK | 2450 | 1300 | | 10 | KING | 5000 | 1300 | | 10 | MILLER | 1300 | 1300 | | 10 | JACCKA | 5000 | 1300 | | 10 | WELAN | 2450 | 1300 | | 20 | FORD | 3000 | 3000 | -- First row of the current window. | 20 | SCOTT | 3000 | 3000 | | 20 | SMITH | 800 | 3000 | | 20 | ADAMS | 1100 | 3000 | | 20 | JONES | 2975 | 3000 | | 30 | TURNER | 1500 | 1500 | -- First row of the current window. | 30 | JAMES | 950 | 1500 | | 30 | ALLEN | 1600 | 1500 | | 30 | WARD | 1250 | 1500 | | 30 | MARTIN | 1250 | 1500 | | 30 | BLAKE | 2850 | 1500 | +------------+------------+------------+-------------+ -
order by belirtildiğinde:
select deptno, ename, sal, first_value(sal) over (partition by deptno order by sal desc) as first_value from emp;Aşağıdaki sonuç döndürülür:
+------------+------------+------------+-------------+ | deptno | ename | sal | first_value | +------------+------------+------------+-------------+ | 10 | JACCKA | 5000 | 5000 | -- First row of the current window. | 10 | KING | 5000 | 5000 | | 10 | CLARK | 2450 | 5000 | | 10 | WELAN | 2450 | 5000 | | 10 | TEBAGE | 1300 | 5000 | | 10 | MILLER | 1300 | 5000 | | 20 | SCOTT | 3000 | 3000 | -- First row of the current window. | 20 | FORD | 3000 | 3000 | | 20 | JONES | 2975 | 3000 | | 20 | ADAMS | 1100 | 3000 | | 20 | SMITH | 800 | 3000 | | 30 | BLAKE | 2850 | 2850 | -- First row of the current window. | 30 | ALLEN | 1600 | 2850 | | 30 | TURNER | 1500 | 2850 | | 30 | MARTIN | 1250 | 2850 | | 30 | WARD | 1250 | 2850 | | 30 | JAMES | 950 | 2850 | +------------+------------+------------+-------------+
-
LAG
-
Sözdizimi
lag(<expr>[,bigint <offset>[, <default>]]) over([partition_clause] orderby_clause) -
Açıklama
Mevcut satırdan offset satır önceki (bölümün başına doğru) satırdaki expr ifadesinin değerini döndürür. expr ifadesi bir sütun, sütun işlemi veya işlev işlemi olabilir.
-
Parametreler
expr: Zorunludur. Hesaplanacak ifade.
offset: İsteğe bağlıdır. 1'e eşit veya 1'den büyük bir BIGINT sabiti olan ofset değeri. 1 değeri önceki satırı gösterir. Varsayılan değer 1'dir. Giriş değeri STRING veya DOUBLE türündeyse, hesaplama için örtülü olarak BIGINT türüne dönüştürülür.
default: İsteğe bağlıdır. offset sınırların dışına çıktığında döndürülecek varsayılan değeri belirtir. Bu parametre belirtilmezse varsayılan değer NULL olur. Değer, expr ile aynı veri türüne sahip bir sabit olmalıdır. expr bir sabit değilse bu değer mevcut satıra göre değerlendirilir.
partition_clause ve orderby_clause: Daha fazla bilgi için bkz. windowing_definition.
-
Dönüş değeri
Dönüş değeri, expr ile aynı veri türüne sahiptir.
-
Örnek
Departmana (deptno) göre bölümleme yapın ve her çalışan için önceki satırdaki maaşı (sal) alın. Komut aşağıdaki gibidir:
select deptno, ename, sal, lag(sal, 1) over (partition by deptno order by sal) as sal_new from emp;Aşağıdaki sonuç döndürülür:
+------------+------------+------------+------------+ | deptno | ename | sal | sal_new | +------------+------------+------------+------------+ | 10 | TEBAGE | 1300 | NULL | | 10 | MILLER | 1300 | 1300 | | 10 | CLARK | 2450 | 1300 | | 10 | WELAN | 2450 | 2450 | | 10 | KING | 5000 | 2450 | | 10 | JACCKA | 5000 | 5000 | | 20 | SMITH | 800 | NULL | | 20 | ADAMS | 1100 | 800 | | 20 | JONES | 2975 | 1100 | | 20 | SCOTT | 3000 | 2975 | | 20 | FORD | 3000 | 3000 | | 30 | JAMES | 950 | NULL | | 30 | MARTIN | 1250 | 950 | | 30 | WARD | 1250 | 1250 | | 30 | TURNER | 1500 | 1250 | | 30 | ALLEN | 1600 | 1500 | | 30 | BLAKE | 2850 | 1600 | +------------+------------+------------+------------+
LAST_VALUE
-
Sözdizimi
last_value(<expr>[, <ignore_nulls>]) over([partition_clause] [orderby_clause] [frame_clause]) -
Açıklama
Pencere çerçevesinin son satırındaki expr ifadesinin değerini döndürür.
Parametreler
expr: Zorunludur. Hesaplanacak ifade.
ignore_nulls: İsteğe bağlıdır. NULL değerlerin yoksayılıp yoksayılmayacağını belirten bir BOOLEAN değeridir. Varsayılan değer False'tur. Bu parametre True olarak ayarlandığında, işlev pencere çerçevesindeki expr ifadesinin son NULL olmayan değerini döndürür.
partition_clause, orderby_clause ve frame_clause: Daha fazla bilgi için bkz. windowing_definition.
-
Dönüş değeri
Dönüş değeri, expr ile aynı veri türüne sahiptir.
-
Örnek
Aşağıdaki komut, tüm çalışanları departmana göre gruplar ve her gruptan son veri satırını döndürür:
-
order by yan tümcesi olmadan pencere çerçevesi, bölümdeki tüm satırları içerir. İşlev, bölümdeki son satırdaki değeri döndürür.
select deptno, ename, sal, last_value(sal) over (partition by deptno) as last_value from emp;Aşağıdaki sonuç döndürülür:
+------------+------------+------------+-------------+ | deptno | ename | sal | last_value | +------------+------------+------------+-------------+ | 10 | TEBAGE | 1300 | 2450 | | 10 | CLARK | 2450 | 2450 | | 10 | KING | 5000 | 2450 | | 10 | MILLER | 1300 | 2450 | | 10 | JACCKA | 5000 | 2450 | | 10 | WELAN | 2450 | 2450 | -- Last row of the current window. | 20 | FORD | 3000 | 2975 | | 20 | SCOTT | 3000 | 2975 | | 20 | SMITH | 800 | 2975 | | 20 | ADAMS | 1100 | 2975 | | 20 | JONES | 2975 | 2975 | -- Last row of the current window. | 30 | TURNER | 1500 | 2850 | | 30 | JAMES | 950 | 2850 | | 30 | ALLEN | 1600 | 2850 | | 30 | WARD | 1250 | 2850 | | 30 | MARTIN | 1250 | 2850 | | 30 | BLAKE | 2850 | 2850 | -- Last row of the current window. +------------+------------+------------+-------------+ -
order by yan tümcesi ile birlikte kullanıldığında varsayılan pencere çerçevesi
RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROWolur. İşlev, mevcut satırdaki değeri döndürür.select deptno, ename, sal, last_value(sal) over (partition by deptno order by sal desc) as last_value from emp;Aşağıdaki sonuç döndürülür:
+------------+------------+------------+-------------+ | deptno | ename | sal | last_value | +------------+------------+------------+-------------+ | 10 | JACCKA | 5000 | 5000 | -- Current row of the current window. | 10 | KING | 5000 | 5000 | -- Current row of the current window. | 10 | CLARK | 2450 | 2450 | -- Current row of the current window. | 10 | WELAN | 2450 | 2450 | -- Current row of the current window. | 10 | TEBAGE | 1300 | 1300 | -- Current row of the current window. | 10 | MILLER | 1300 | 1300 | -- Current row of the current window. | 20 | SCOTT | 3000 | 3000 | -- Current row of the current window. | 20 | FORD | 3000 | 3000 | -- Current row of the current window. | 20 | JONES | 2975 | 2975 | -- Current row of the current window. | 20 | ADAMS | 1100 | 1100 | -- Current row of the current window. | 20 | SMITH | 800 | 800 | -- Current row of the current window. | 30 | BLAKE | 2850 | 2850 | -- Current row of the current window. | 30 | ALLEN | 1600 | 1600 | -- Current row of the current window. | 30 | TURNER | 1500 | 1500 | -- Current row of the current window. | 30 | MARTIN | 1250 | 1250 | -- Current row of the current window. | 30 | WARD | 1250 | 1250 | -- Current row of the current window. | 30 | JAMES | 950 | 950 | -- Current row of the current window. +------------+------------+------------+-------------+
-
LEAD
-
Sözdizimi
lead(<expr>[, bigint <offset>[, <default>]]) over([partition_clause] orderby_clause) -
Açıklama
Mevcut satırdan offset satır sonraki (bölümün sonuna doğru) satırdaki expr ifadesinin değerini döndürür. expr ifadesi bir sütun, sütun işlemi veya işlev işlemi olabilir.
-
Parametreler
expr: Zorunludur. Hesaplanacak ifade.
offset: İsteğe bağlıdır. 0'a eşit veya 0'dan büyük bir BIGINT sabiti olan ofset değeri. 0 değeri mevcut satırı, 1 değeri ise sonraki satırı gösterir. Varsayılan değer 1'dir. Giriş değeri STRING veya DOUBLE türündeyse, hesaplama için örtülü olarak BIGINT türüne dönüştürülür.
default: İsteğe bağlıdır. offset sınırların dışına çıktığında döndürülecek değerdir. Bu değer, expr ile aynı veri türüne sahip bir sabit olmalıdır. Varsayılan değer NULL'dur. expr bir sabit değilse değer mevcut satıra göre değerlendirilir.
partition_clause ve orderby_clause: Daha fazla bilgi için bkz. windowing_definition.
-
Dönüş değeri
Dönüş değeri, expr ile aynı veri türüne sahiptir.
-
Örnek
Departmana (deptno) göre bölümleme yapın ve her çalışan için sonraki satırdaki maaşı (sal) alın. Komut aşağıdaki gibidir:
select deptno, ename, sal, lead(sal, 1) over (partition by deptno order by sal) as sal_new from emp;Aşağıdaki sonuç döndürülür:
+------------+------------+------------+------------+ | deptno | ename | sal | sal_new | +------------+------------+------------+------------+ | 10 | TEBAGE | 1300 | 1300 | | 10 | MILLER | 1300 | 2450 | | 10 | CLARK | 2450 | 2450 | | 10 | WELAN | 2450 | 5000 | | 10 | KING | 5000 | 5000 | | 10 | JACCKA | 5000 | NULL | | 20 | SMITH | 800 | 1100 | | 20 | ADAMS | 1100 | 2975 | | 20 | JONES | 2975 | 3000 | | 20 | SCOTT | 3000 | 3000 | | 20 | FORD | 3000 | NULL | | 30 | JAMES | 950 | 1250 | | 30 | MARTIN | 1250 | 1250 | | 30 | WARD | 1250 | 1500 | | 30 | TURNER | 1500 | 1600 | | 30 | ALLEN | 1600 | 2850 | | 30 | BLAKE | 2850 | NULL | +------------+------------+------------+------------+
MAX
-
Sözdizimi
max(<expr>) over([partition_clause] [orderby_clause] [frame_clause]) -
Açıklama
Bir penceredeki expr ifadesinin maksimum değerini döndürür.
-
Parametreler
expr: Zorunludur. Maksimum değeri hesaplamak için kullanılan ifade. BOOLEAN dışında herhangi bir veri türünde olabilir. Değer NULL ise satır hesaplamaya dahil edilmez.
partition_clause, orderby_clause ve frame_clause: Daha fazla bilgi için bkz. windowing_definition.
-
Dönüş değeri
Dönüş değeri, expr ile aynı veri türüne sahiptir.
-
Örnekler
-
Örnek 1: Departmana (deptno) göre bölümleme yaparak maksimum maaşı (sal) hesaplayın ve sıralama yapmayın. İşlev, mevcut bölümün (aynı deptno değerine sahip satırlar) maksimum değerini döndürür. Komut aşağıdaki gibidir:
select deptno, sal, max(sal) over (partition by deptno) from emp;Aşağıdaki sonuç döndürülür:
+------------+------------+------------+ | deptno | sal | _c2 | +------------+------------+------------+ | 10 | 1300 | 5000 | -- First row of the window. The value is the maximum from the first to the sixth row. | 10 | 2450 | 5000 | -- The value is the maximum from the first to the sixth row. | 10 | 5000 | 5000 | -- The value is the maximum from the first to the sixth row. | 10 | 1300 | 5000 | | 10 | 5000 | 5000 | | 10 | 2450 | 5000 | | 20 | 3000 | 3000 | | 20 | 3000 | 3000 | | 20 | 800 | 3000 | | 20 | 1100 | 3000 | | 20 | 2975 | 3000 | | 30 | 1500 | 2850 | | 30 | 950 | 2850 | | 30 | 1600 | 2850 | | 30 | 1250 | 2850 | | 30 | 1250 | 2850 | | 30 | 2850 | 2850 | +------------+------------+------------+ -
Örnek 2: Departmana (deptno) göre bölümleme yaparak maksimum maaşı (sal) hesaplayın ve sonuçları sıralayın. İşlev, mevcut bölümün (aynı deptno değerine sahip satırlar) ilk satırından mevcut satıra kadar olan maksimum değeri döndürür. Komut aşağıdaki gibidir:
select deptno, sal, max(sal) over (partition by deptno order by sal) from emp;Aşağıdaki sonuç döndürülür:
+------------+------------+------------+ | deptno | sal | _c2 | +------------+------------+------------+ | 10 | 1300 | 1300 | -- First row of the window. | 10 | 1300 | 1300 | -- Maximum value from the first to the second row. | 10 | 2450 | 2450 | -- Maximum value from the first to the third row. | 10 | 2450 | 2450 | -- Maximum value from the first to the fourth row. | 10 | 5000 | 5000 | | 10 | 5000 | 5000 | | 20 | 800 | 800 | | 20 | 1100 | 1100 | | 20 | 2975 | 2975 | | 20 | 3000 | 3000 | | 20 | 3000 | 3000 | | 30 | 950 | 950 | | 30 | 1250 | 1250 | | 30 | 1250 | 1250 | | 30 | 1500 | 1500 | | 30 | 1600 | 1600 | | 30 | 2850 | 2850 | +------------+------------+------------+
-
MEDIAN
-
Sözdizimi
median(<expr>) over ([partition_clause] [orderby_clause] [frame_clause]) -
Açıklama
Bir penceredeki expr ifadesinin medyanını hesaplar.
-
Parametreler
-
expr: Zorunludur. Medyanını hesaplamak istediğiniz ifade. DOUBLE veya DECIMAL türünde olmalıdır.
Giriş değeri STRING veya BIGINT türündeyse hesaplama için örtülü olarak DOUBLE türüne dönüştürülür. Diğer veri türleri için hata döndürülür.
Giriş NULL ise dönüş değeri NULL olur.
partition_clause, orderby_clause ve frame_clause: Daha fazla bilgi için bkz. windowing_definition.
-
-
Dönüş değeri
DOUBLE veya DECIMAL değeri döndürür. Tüm expr değerleri NULL ise NULL döndürülür.
-
Örnek
Departmana (deptno) göre bölümleme yaparak medyan maaşı (sal) hesaplayın. İşlev, tüm bölümün (aynı deptno değerine sahip tüm satırlar) medyanını döndürür. Komut aşağıdaki gibidir:
select deptno, sal, median(sal) over (partition by deptno) from emp;Aşağıdaki sonuç döndürülür:
+------------+------------+------------+ | deptno | sal | _c2 | +------------+------------+------------+ | 10 | 1300 | 2450.0 | -- First row of the window. The value is the median from the first to the sixth row. | 10 | 2450 | 2450.0 | | 10 | 5000 | 2450.0 | | 10 | 1300 | 2450.0 | | 10 | 5000 | 2450.0 | | 10 | 2450 | 2450.0 | | 20 | 3000 | 2975.0 | | 20 | 3000 | 2975.0 | | 20 | 800 | 2975.0 | | 20 | 1100 | 2975.0 | | 20 | 2975 | 2975.0 | | 30 | 1500 | 1375.0 | | 30 | 950 | 1375.0 | | 30 | 1600 | 1375.0 | | 30 | 1250 | 1375.0 | | 30 | 1250 | 1375.0 | | 30 | 2850 | 1375.0 | +------------+------------+------------+
MIN
-
Sözdizimi
min(<expr>) over([partition_clause] [orderby_clause] [frame_clause]) -
Açıklama
Bir penceredeki expr ifadesinin minimum değerini döndürür.
-
Parametreler
expr: Zorunludur. Minimum değeri hesaplamak için kullanılan ifade. BOOLEAN dışında herhangi bir veri türünde olabilir. Değer NULL ise satır hesaplamaya dahil edilmez.
partition_clause, orderby_clause ve frame_clause: Daha fazla bilgi için bkz. windowing_definition.
-
Dönüş değeri
Dönüş değeri, expr ile aynı veri türüne sahiptir.
-
Örnekler
-
Örnek 1: Departmana (deptno) göre bölümleme yaparak minimum maaşı (sal) hesaplayın ve sıralama yapmayın. İşlev, mevcut bölümün (aynı deptno değerine sahip satırlar) minimum değerini döndürür. Komut aşağıdaki gibidir:
select deptno, sal, min(sal) over (partition by deptno) from emp;Aşağıdaki sonuç döndürülür:
+------------+------------+------------+ | deptno | sal | _c2 | +------------+------------+------------+ | 10 | 1300 | 1300 | -- First row of the window. The value is the minimum from the first to the sixth row. | 10 | 2450 | 1300 | -- The value is the minimum from the first to the sixth row. | 10 | 5000 | 1300 | -- The value is the minimum from the first to the sixth row. | 10 | 1300 | 1300 | | 10 | 5000 | 1300 | | 10 | 2450 | 1300 | | 20 | 3000 | 800 | | 20 | 3000 | 800 | | 20 | 800 | 800 | | 20 | 1100 | 800 | | 20 | 2975 | 800 | | 30 | 1500 | 950 | | 30 | 950 | 950 | | 30 | 1600 | 950 | | 30 | 1250 | 950 | | 30 | 1250 | 950 | | 30 | 2850 | 950 | +------------+------------+------------+ -
Örnek 2: Departmana (deptno) göre bölümleme yaparak minimum maaşı (sal) hesaplayın ve sonuçları sıralayın. İşlev, mevcut bölümün (aynı deptno değerine sahip satırlar) ilk satırından mevcut satıra kadar olan minimum değeri döndürür. Komut aşağıdaki gibidir:
select deptno, sal, min(sal) over (partition by deptno order by sal) from emp;Aşağıdaki sonuç döndürülür:
+------------+------------+------------+ | deptno | sal | _c2 | +------------+------------+------------+ | 10 | 1300 | 1300 | -- First row of the window. | 10 | 1300 | 1300 | -- Minimum value from the first to the second row. | 10 | 2450 | 1300 | -- Minimum value from the first to the third row. | 10 | 2450 | 1300 | | 10 | 5000 | 1300 | | 10 | 5000 | 1300 | | 20 | 800 | 800 | | 20 | 1100 | 800 | | 20 | 2975 | 800 | | 20 | 3000 | 800 | | 20 | 3000 | 800 | | 30 | 950 | 950 | | 30 | 1250 | 950 | | 30 | 1250 | 950 | | 30 | 1500 | 950 | | 30 | 1600 | 950 | | 30 | 2850 | 950 | +------------+------------+------------+
-
NTILE
-
Sözdizimi
bigint ntile(bigint <N>) over ([partition_clause] [orderby_clause]) -
Açıklama
Bir bölümdeki sıralı satırları mümkün olduğunca eşit büyüklükte N gruba böler ve her satır için grup numarasını döndürür. Satır sayısı N'ye tam bölünmüyorsa ilk gruplar (daha küçük grup numaralarına sahip olanlar) bir ekstra satır içerir.
-
Parametreler
N: Zorunludur. Grup sayısı. Bir BIGINT değeridir.
partition_clause ve orderby_clause: Daha fazla bilgi için bkz. windowing_definition.
-
Dönüş değeri
BIGINT değeri döndürür.
-
Örnek
Her departmandaki tüm çalışanları maaşa (sal) göre azalan sırada 3 gruba bölün ve her çalışan için grup numarasını döndürün. Komut aşağıdaki gibidir:
select deptno, ename, sal, ntile(3) over (partition by deptno order by sal desc) as nt3 from emp;Aşağıdaki sonuç döndürülür:
+------------+------------+------------+------------+ | deptno | ename | sal | nt3 | +------------+------------+------------+------------+ | 10 | JACCKA | 5000 | 1 | | 10 | KING | 5000 | 1 | | 10 | CLARK | 2450 | 2 | | 10 | WELAN | 2450 | 2 | | 10 | TEBAGE | 1300 | 3 | | 10 | MILLER | 1300 | 3 | | 20 | SCOTT | 3000 | 1 | | 20 | FORD | 3000 | 1 | | 20 | JONES | 2975 | 2 | | 20 | ADAMS | 1100 | 2 | | 20 | SMITH | 800 | 3 | | 30 | BLAKE | 2850 | 1 | | 30 | ALLEN | 1600 | 1 | | 30 | TURNER | 1500 | 2 | | 30 | MARTIN | 1250 | 2 | | 30 | WARD | 1250 | 3 | | 30 | JAMES | 950 | 3 | +------------+------------+------------+------------+
NTH_VALUE
-
Sözdizimi
nth_value(<expr>, <number> [, <ignore_nulls>]) over ([partition_clause] [orderby_clause] [frame_clause]) -
Açıklama
Pencere çerçevesinin N inci satırındaki expr ifadesinin değerini döndürür.
-
Parametreler
expr: Zorunludur. Hesaplanacak ifade.
number: Zorunludur. Bir BIGINT değeridir. 1'e eşit veya 1'den büyük bir tamsayıdır. Değer 1 ise bu işlev FIRST_VALUE işlevine eşdeğerdir.
ignore_nulls: İsteğe bağlıdır. NULL değerlerin yoksayılıp yoksayılmayacağını belirten bir BOOLEAN değeridir. Varsayılan değer False'tur. Bu parametre True olarak ayarlandığında, işlev pencere çerçevesindeki expr ifadesinin N'inci NULL olmayan değerini döndürür.
partition_clause, orderby_clause ve frame_clause: Daha fazla bilgi için bkz. windowing_definition.
-
Dönüş değeri
Dönüş değeri, expr ile aynı veri türüne sahiptir.
-
Örnek
Aşağıdaki komut, tüm çalışanları departmana göre gruplar ve her gruptan 6. veri satırını döndürür:
-
order by yan tümcesi olmadan pencere çerçevesi, bölümdeki tüm satırları içerir. İşlev, bölümdeki 6. satırın değerini döndürür.
select deptno, ename, sal, nth_value(sal,6) over (partition by deptno) as nth_value from emp;Aşağıdaki sonuç döndürülür:
+------------+------------+------------+------------+ | deptno | ename | sal | nth_value | +------------+------------+------------+------------+ | 10 | TEBAGE | 1300 | 2450 | | 10 | CLARK | 2450 | 2450 | | 10 | KING | 5000 | 2450 | | 10 | MILLER | 1300 | 2450 | | 10 | JACCKA | 5000 | 2450 | | 10 | WELAN | 2450 | 2450 | -- 6th row of the current window. | 20 | FORD | 3000 | NULL | | 20 | SCOTT | 3000 | NULL | | 20 | SMITH | 800 | NULL | | 20 | ADAMS | 1100 | NULL | | 20 | JONES | 2975 | NULL | -- The current window does not have a 6th row, so NULL is returned. | 30 | TURNER | 1500 | 2850 | | 30 | JAMES | 950 | 2850 | | 30 | ALLEN | 1600 | 2850 | | 30 | WARD | 1250 | 2850 | | 30 | MARTIN | 1250 | 2850 | | 30 | BLAKE | 2850 | 2850 | -- 6th row of the current window. +------------+------------+------------+------------+ -
order by yan tümcesi ile birlikte kullanıldığında varsayılan pencere çerçevesi
RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROWolur. İşlev, pencere çerçevesindeki 6. satırın değerini döndürür.select deptno, ename, sal, nth_value(sal,6) over (partition by deptno order by sal) as nth_value from emp;Aşağıdaki sonuç döndürülür:
+------------+------------+------------+------------+ | deptno | ename | sal | nth_value | +------------+------------+------------+------------+ | 10 | TEBAGE | 1300 | NULL | | 10 | MILLER | 1300 | NULL | -- The current window has only 2 rows, so the 6th row exceeds the window length. | 10 | CLARK | 2450 | NULL | | 10 | WELAN | 2450 | NULL | | 10 | KING | 5000 | 5000 | | 10 | JACCKA | 5000 | 5000 | | 20 | SMITH | 800 | NULL | | 20 | ADAMS | 1100 | NULL | | 20 | JONES | 2975 | NULL | | 20 | SCOTT | 3000 | NULL | | 20 | FORD | 3000 | NULL | | 30 | JAMES | 950 | NULL | | 30 | MARTIN | 1250 | NULL | | 30 | WARD | 1250 | NULL | | 30 | TURNER | 1500 | NULL | | 30 | ALLEN | 1600 | NULL | | 30 | BLAKE | 2850 | 2850 | +------------+------------+------------+------------+
-
PERCENT_RANK
-
Sözdizimi
double percent_rank() over([partition_clause] [orderby_clause]) -
Açıklama
orderby_clause tarafından belirtilen sıralama düzenine göre mevcut satırın kendi bölümü içindeki yüzde sırasını hesaplar.
-
Parametreler
partition_clause ve orderby_clause: Daha fazla bilgi için bkz. windowing_definition.
-
Dönüş değeri
[0,0, 1,0] aralığında bir DOUBLE değeri döndürür. Belirli dönüş değeri
“(rank - 1) / (partition_row_count - 1)”formülüne eşittir; buradarankilgili satır için RANK pencere işlevinin sonucunu,partition_row_countise satırın ait olduğu bölümdeki satır sayısını temsil eder. Bölüm yalnızca bir satır içeriyorsa çıktı 0,0 olur. -
Örnek
Her çalışanın maaşının kendi departmanı içindeki yüzde sırasını hesaplayın. Komut aşağıdaki gibidir:
select deptno, ename, sal, percent_rank() over (partition by deptno order by sal desc) as sal_new from emp;Aşağıdaki sonuç döndürülür:
+------------+------------+------------+------------+ | deptno | ename | sal | sal_new | +------------+------------+------------+------------+ | 10 | JACCKA | 5000 | 0.0 | | 10 | KING | 5000 | 0.0 | | 10 | CLARK | 2450 | 0.4 | | 10 | WELAN | 2450 | 0.4 | | 10 | TEBAGE | 1300 | 0.8 | | 10 | MILLER | 1300 | 0.8 | | 20 | SCOTT | 3000 | 0.0 | | 20 | FORD | 3000 | 0.0 | | 20 | JONES | 2975 | 0.5 | | 20 | ADAMS | 1100 | 0.75 | | 20 | SMITH | 800 | 1.0 | | 30 | BLAKE | 2850 | 0.0 | | 30 | ALLEN | 1600 | 0.2 | | 30 | TURNER | 1500 | 0.4 | | 30 | MARTIN | 1250 | 0.6 | | 30 | WARD | 1250 | 0.6 | | 30 | JAMES | 950 | 1.0 | +------------+------------+------------+------------+
PERCENTILE_CONT
-
Sözdizimi
-- Calculate the exact percentile PERCENTILE_CONT(<col_name>, DOUBLE <percentile>[, BOOLEAN <isIgnoreNull>]) -- Calculate the exact percentile in a window PERCENTILE_CONT(<col_name>, DOUBLE <percentile>[, BOOLEAN <isIgnoreNull>]) OVER ([partition_clause] [orderby_clause]) -
Açıklama
Kesin yüzdelik dilim değerini hesaplar. İşlev, doğrusal enterpolasyon algoritması kullanır; belirtilen sütunu artan düzende sıralar ve belirtilen percentile konumundaki kesin değeri döndürür.
-
Parametreler
col_name: Gereklidir. DOUBLE veya DECIMAL türünde bir sütun olmalıdır.
percentile: Gereklidir. Hesaplanacak yüzdelik dilim değeridir. [0, 1] aralığında bir DOUBLE sabit olmalıdır.
isIgnoreNull: İsteğe bağlıdır. NULL değerlerin yoksayılıp yoksayılmayacağını belirtir. BOOLEAN türünde bir sabittir. Varsayılan değer TRUE'dur. FALSE olarak ayarlandığında, NULL değerler sıralama sırasında minimum değer olarak işlenir.
partition_clause ve orderby_clause: Daha fazla bilgi için bkz. windowing_definition..
-
Dönüş değeri
Hesaplanan yüzdelik dilim değerini DOUBLE türünde döndürür.
-
Örnekler
-
Örnek 1: NULL değerleri yoksayarak pencere içindeki kesin yüzdelik dilim değerini hesaplayın.
SELECT PERCENTILE_CONT(x, 0) OVER() AS min, PERCENTILE_CONT(x, 0.01) OVER() AS percentile1, PERCENTILE_CONT(x, 0.5) OVER() AS median, PERCENTILE_CONT(x, 0.9) OVER() AS percentile90, PERCENTILE_CONT(x, 1) OVER() AS max FROM VALUES(0D),(3D),(NULL),(1D),(2D) AS tbl(x) LIMIT 1; -- Return result +------------+-------------+------------+--------------+------------+ | min | percentile1 | median | percentile90 | max | +------------+-------------+------------+--------------+------------+ | 0.0 | 0.03 | 1.5 | 2.7 | 3.0 | +------------+-------------+------------+--------------+------------+ -
Örnek 2: NULL değerleri yoksaymayın. NULL değerler sıralama sırasında minimum değer olarak işlenir. Pencere içindeki kesin yüzdelik dilim değerini hesaplayın.
SELECT PERCENTILE_CONT(x, 0, false) OVER() AS min, PERCENTILE_CONT(x, 0.01, false) OVER() AS percentile1, PERCENTILE_CONT(x, 0.5, false) OVER() AS median, PERCENTILE_CONT(x, 0.9, false) OVER() AS percentile90, PERCENTILE_CONT(x, 1, false) OVER() AS max FROM VALUES(0D),(3D),(NULL),(1D),(2D) AS tbl(x) LIMIT 1; -- Return result +------------+-------------+------------+--------------+------------+ | min | percentile1 | median | percentile90 | max | +------------+-------------+------------+--------------+------------+ | NULL | 0.0 | 1.0 | 2.6 | 3.0 | +------------+-------------+------------+--------------+------------+
-
PERCENTILE_DISC
-
Sözdizimi
-- Calculate a given percentile value PERCENTILE_DISC(<col_name>, DOUBLE <percentile>[, BOOLEAN <isIgnoreNull>]) -- Calculate the percentile value in a window PERCENTILE_DISC(<col_name>, DOUBLE <percentile>[, BOOLEAN <isIgnoreNull>]) OVER ([partition_clause] [orderby_clause]) -
Açıklama
Belirtilen yüzdelik dilim değerini hesaplar. Önce belirtilen sütunu artan düzende sıralar, ardından kümülatif dağılımı belirtilen yüzdelik dilime eşit veya ondan büyük olan ilk değeri döndürür.
-
Parametreler
col_name: Gereklidir. Sıralanabilir herhangi bir veri türüne sahip bir sütun olmalıdır.
percentile: Gereklidir. Hesaplanacak yüzdelik dilim değeridir. [0, 1] aralığında bir DOUBLE sabit olmalıdır.
isIgnoreNull: İsteğe bağlıdır. NULL değerlerin yoksayılıp yoksayılmayacağını belirtir. BOOLEAN türünde bir sabittir. Varsayılan değer TRUE'dur. FALSE olarak ayarlandığında, NULL değerler sıralama sırasında minimum değer olarak işlenir.
partition_clause ve orderby_clause: Daha fazla bilgi için bkz. windowing_definition.
-
Dönüş değeri
Hesaplanan yüzdelik dilim değerini döndürür. Veri türü, giriş col_name sütunuyla aynıdır.
-
Örnekler
-
Örnek 1: NULL değerleri yoksayarak pencere içindeki yüzdelik dilim değerini hesaplayın.
SELECT x, PERCENTILE_DISC(x, 0) OVER() AS min, PERCENTILE_DISC(x, 0.5) OVER() AS median, PERCENTILE_DISC(x, 1) OVER() AS max FROM VALUES('c'),(NULL),('b'),('a') AS tbl(x); -- Return result +------------+------------+------------+------------+ | x | min | median | max | +------------+------------+------------+------------+ | c | a | b | c | | NULL | a | b | c | | b | a | b | c | | a | a | b | c | +------------+------------+------------+------------+ -
Örnek 2: NULL değerleri yoksaymayın. NULL değerler sıralama sırasında minimum değer olarak işlenir. Pencere içindeki yüzdelik dilim değerini hesaplayın.
SELECT x, PERCENTILE_DISC(x, 0, false) OVER() AS min, PERCENTILE_DISC(x, 0.5, false) OVER() AS median, PERCENTILE_DISC(x, 1, false) OVER() AS max FROM VALUES('c'),(NULL),('b'),('a') AS tbl(x); -- Return result +------------+------------+------------+------------+ | x | min | median | max | +------------+------------+------------+------------+ | c | NULL | a | c | | NULL | NULL | a | c | | b | NULL | a | c | | a | NULL | a | c | +------------+------------+------------+------------+
-
RANK
-
Sözdizimi
bigint rank() over ([partition_clause] [orderby_clause]) -
Açıklama
orderby_clause tarafından belirtilen sıralama düzenine göre, mevcut satırın kendi bölümü içindeki sırasını hesaplar. Sayma 1'den başlar.
-
Parametreler
partition_clause ve orderby_clause: Daha fazla bilgi için bkz. windowing_definition.
-
Dönüş değeri
BIGINT türünde bir değer döndürür. Dönüş değerleri tekrar edebilir ve ardışık olmayabilir. Belirli dönüş değeri, veri satırının ait olduğu GRUBUN ilk satırındaki
ROW_NUMBER()değeridir. Bir orderby_clause belirtilmezse, tüm satırlara 1 sırası atanır. -
Örnek
Departmana (deptno) göre bölümleyin ve her departman içindeki çalışanları maaşlarına (sal) göre azalan sırada sıralayın. Komut aşağıdaki gibidir:
select deptno, ename, sal, rank() over (partition by deptno order by sal desc) as nums from emp;Aşağıdaki sonuç döndürülür:
+------------+------------+------------+------------+ | deptno | ename | sal | nums | +------------+------------+------------+------------+ | 10 | JACCKA | 5000 | 1 | | 10 | KING | 5000 | 1 | | 10 | CLARK | 2450 | 3 | | 10 | WELAN | 2450 | 3 | | 10 | TEBAGE | 1300 | 5 | | 10 | MILLER | 1300 | 5 | | 20 | SCOTT | 3000 | 1 | | 20 | FORD | 3000 | 1 | | 20 | JONES | 2975 | 3 | | 20 | ADAMS | 1100 | 4 | | 20 | SMITH | 800 | 5 | | 30 | BLAKE | 2850 | 1 | | 30 | ALLEN | 1600 | 2 | | 30 | TURNER | 1500 | 3 | | 30 | MARTIN | 1250 | 4 | | 30 | WARD | 1250 | 4 | | 30 | JAMES | 950 | 6 | +------------+------------+------------+------------+
ROW_NUMBER
-
Sözdizimi
row_number() over([partition_clause] [orderby_clause]) -
Açıklama
Mevcut satırın kendi bölümü içindeki satır numarasını hesaplar. Sayma 1'den başlar.
-
Parametreler
Daha fazla bilgi için bkz. windowing_definition. frame_clause kullanımına izin verilmez.
-
Dönüş değeri
BIGINT türünde bir değer döndürür.
-
Örnek
Departmana (deptno) göre bölümleyin ve her departman içindeki çalışanlara maaşlarına (sal) göre azalan sırada benzersiz, ardışık bir numara atayın. Komut aşağıdaki gibidir:
select deptno, ename, sal, row_number() over (partition by deptno order by sal desc) as nums from emp;Aşağıdaki sonuç döndürülür:
+------------+------------+------------+------------+ | deptno | ename | sal | nums | +------------+------------+------------+------------+ | 10 | JACCKA | 5000 | 1 | | 10 | KING | 5000 | 2 | | 10 | CLARK | 2450 | 3 | | 10 | WELAN | 2450 | 4 | | 10 | TEBAGE | 1300 | 5 | | 10 | MILLER | 1300 | 6 | | 20 | SCOTT | 3000 | 1 | | 20 | FORD | 3000 | 2 | | 20 | JONES | 2975 | 3 | | 20 | ADAMS | 1100 | 4 | | 20 | SMITH | 800 | 5 | | 30 | BLAKE | 2850 | 1 | | 30 | ALLEN | 1600 | 2 | | 30 | TURNER | 1500 | 3 | | 30 | MARTIN | 1250 | 4 | | 30 | WARD | 1250 | 5 | | 30 | JAMES | 950 | 6 | +------------+------------+------------+------------+
STDDEV
-
Sözdizimi
double stddev|stddev_pop([distinct] <expr>) over ([partition_clause] [orderby_clause] [frame_clause]) decimal stddev|stddev_pop([distinct] <expr>) over ([partition_clause] [orderby_clause] [frame_clause]) -
Açıklama
Popülasyon standart sapmasını hesaplar. Bu, STDDEV_POP işlevinin takma adıdır.
-
Parametreler
-
expr: Gereklidir. Popülasyon standart sapmasının hesaplanacağı ifadedir. DOUBLE veya DECIMAL türünde olmalıdır.
Giriş değeri STRING veya BIGINT türündeyse, hesaplama için örtük olarak DOUBLE türüne dönüştürülür. Diğer veri türleri için hata döndürülür.
Giriş değeri NULL ise, satır hesaplamaya dahil edilmez.
distinct anahtar sözcüğünü belirtirseniz, işlev benzersiz değerlerin popülasyon standart sapmasını hesaplar.
partition_clause, orderby_clause ve frame_clause: Daha fazla bilgi için bkz. windowing_definition.
-
-
Dönüş değeri
Dönüş değeri, expr ile aynı veri türüne sahiptir. expr içindeki tüm değerler NULL ise NULL döndürülür.
-
Örnekler
-
Örnek 1: Departmana (deptno) göre bölümleyin, maaşın (sal) popülasyon standart sapmasını hesaplayın ve sıralama yapmayın. İşlev, mevcut bölümün (aynı deptno değerine sahip satırlar) kümülatif popülasyon standart sapmasını döndürür. Komut aşağıdaki gibidir:
select deptno, sal, stddev(sal) over (partition by deptno) from emp;Aşağıdaki sonuç döndürülür:
+------------+------------+------------+ | deptno | sal | _c2 | +------------+------------+------------+ | 10 | 1300 | 1546.1421524412158 | -- First row of the window. The value is the cumulative population standard deviation from the first to the sixth row. | 10 | 2450 | 1546.1421524412158 | -- The value is the cumulative population standard deviation from the first to the sixth row. | 10 | 5000 | 1546.1421524412158 | | 10 | 1300 | 1546.1421524412158 | | 10 | 5000 | 1546.1421524412158 | | 10 | 2450 | 1546.1421524412158 | | 20 | 3000 | 1004.7387720198718 | | 20 | 3000 | 1004.7387720198718 | | 20 | 800 | 1004.7387720198718 | | 20 | 1100 | 1004.7387720198718 | | 20 | 2975 | 1004.7387720198718 | | 30 | 1500 | 610.1001739241042 | | 30 | 950 | 610.1001739241042 | | 30 | 1600 | 610.1001739241042 | | 30 | 1250 | 610.1001739241042 | | 30 | 1250 | 610.1001739241042 | | 30 | 2850 | 610.1001739241042 | +------------+------------+------------+ -
Örnek 2: Hive uyumlu olmayan modda, departmana (deptno) göre bölümleyin, maaşın (sal) popülasyon standart sapmasını hesaplayın ve sonuçları sıralayın. İşlev, mevcut bölümün (aynı deptno değerine sahip satırlar) ilk satırından mevcut satıra kadar olan kümülatif popülasyon standart sapmasını döndürür. Komutlar aşağıdaki gibidir:
-- Disable Hive compatible mode. set odps.sql.hive.compatible=false; -- Execute the following SQL command. select deptno, sal, stddev(sal) over (partition by deptno order by sal) from emp;Aşağıdaki sonuç döndürülür:
+------------+------------+------------+ | deptno | sal | _c2 | +------------+------------+------------+ | 10 | 1300 | 0.0 | -- First row of the window. | 10 | 1300 | 0.0 | -- Cumulative population standard deviation from the first to the second row. | 10 | 2450 | 542.1151989096865 | -- Cumulative population standard deviation from the first to the third row. | 10 | 2450 | 575.0 | -- Cumulative population standard deviation from the first to the fourth row. | 10 | 5000 | 1351.6656391282572 | | 10 | 5000 | 1546.1421524412158 | | 20 | 800 | 0.0 | | 20 | 1100 | 150.0 | | 20 | 2975 | 962.4188277460079 | | 20 | 3000 | 1024.2947268730811 | | 20 | 3000 | 1004.7387720198718 | | 30 | 950 | 0.0 | | 30 | 1250 | 150.0 | | 30 | 1250 | 141.4213562373095 | | 30 | 1500 | 194.8557158514987 | | 30 | 1600 | 226.71568097509268 | | 30 | 2850 | 610.1001739241042 | +------------+------------+------------+ -
Örnek 3: Hive uyumlu modda, departmana (deptno) göre bölümleyin, maaşın (sal) popülasyon standart sapmasını hesaplayın ve sonuçları sıralayın. İşlev, mevcut satırla aynı değere sahip satıra kadar olan kümülatif popülasyon standart sapmasını döndürür (aynı sal değerine sahip satırların popülasyon standart sapması aynıdır). Komutlar aşağıdaki gibidir:
-- Enable Hive compatible mode. set odps.sql.hive.compatible=true; -- Execute the following SQL command. select deptno, sal, stddev(sal) over (partition by deptno order by sal) from emp;Aşağıdaki sonuç döndürülür:
+------------+------------+------------+ | deptno | sal | _c2 | +------------+------------+------------+ | 10 | 1300 | 0.0 | -- First row of the window. Since the sal of the first and second rows are the same, the population standard deviation for the first row is the cumulative population standard deviation of the first two rows. | 10 | 1300 | 0.0 | -- Cumulative population standard deviation from the first to the second row. | 10 | 2450 | 575.0 | -- Since the sal of the third and fourth rows are the same, the population standard deviation for the third row is the cumulative population standard deviation of the first four rows. | 10 | 2450 | 575.0 | -- Cumulative population standard deviation from the first to the fourth row. | 10 | 5000 | 1546.1421524412158 | | 10 | 5000 | 1546.1421524412158 | | 20 | 800 | 0.0 | | 20 | 1100 | 150.0 | | 20 | 2975 | 962.4188277460079 | | 20 | 3000 | 1004.7387720198718 | | 20 | 3000 | 1004.7387720198718 | | 30 | 950 | 0.0 | | 30 | 1250 | 141.4213562373095 | | 30 | 1250 | 141.4213562373095 | | 30 | 1500 | 194.8557158514987 | | 30 | 1600 | 226.71568097509268 | | 30 | 2850 | 610.1001739241042 | +------------+------------+------------+
-
STDDEV_SAMP
-
Sözdizimi
double stddev_samp([distinct] <expr>) over([partition_clause] [orderby_clause] [frame_clause]) decimal stddev_samp([distinct] <expr>) over([partition_clause] [orderby_clause] [frame_clause]) -
Açıklama
Örnek standart sapmayı hesaplar.
-
Parametreler
-
expr: Gereklidir. Örnek standart sapmasının hesaplanacağı ifadedir. DOUBLE veya DECIMAL türünde olmalıdır.
Giriş değeri STRING veya BIGINT türündeyse, hesaplama için örtük olarak DOUBLE türüne dönüştürülür. Diğer veri türleri için hata döndürülür.
Giriş değeri NULL ise, satır hesaplamaya dahil edilmez.
distinct anahtar sözcüğünü belirtirseniz, işlev benzersiz değerlerin örnek standart sapmasını hesaplar.
partition_clause, orderby_clause ve frame_clause: Daha fazla bilgi için bkz. windowing_definition.
-
-
Dönüş değeri
Dönüş değeri, expr ile aynı veri türüne sahiptir. expr içindeki tüm değerler NULL ise NULL döndürülür. Pencerede expr için yalnızca bir tane NULL olmayan değer varsa sonuç 0 olur.
-
Örnekler
-
Örnek 1: Departmana (deptno) göre bölümleyin, maaşın (sal) örnek standart sapmasını hesaplayın ve sıralama yapmayın. İşlev, mevcut bölümün (aynı deptno değerine sahip satırlar) kümülatif örnek standart sapmasını döndürür. Komut aşağıdaki gibidir:
select deptno, sal, stddev_samp(sal) over (partition by deptno) from emp;Aşağıdaki sonuç döndürülür:
+------------+------------+------------+ | deptno | sal | _c2 | +------------+------------+------------+ | 10 | 1300 | 1693.7138680032904 | -- First row of the window. The value is the cumulative sample standard deviation from the first to the sixth row. | 10 | 2450 | 1693.7138680032904 | -- The value is the cumulative sample standard deviation from the first to the sixth row. | 10 | 5000 | 1693.7138680032904 | -- The value is the cumulative sample standard deviation from the first to the sixth row. | 10 | 1300 | 1693.7138680032904 | | 10 | 5000 | 1693.7138680032904 | | 10 | 2450 | 1693.7138680032904 | | 20 | 3000 | 1123.3320969330487 | | 20 | 3000 | 1123.3320969330487 | | 20 | 800 | 1123.3320969330487 | | 20 | 1100 | 1123.3320969330487 | | 20 | 2975 | 1123.3320969330487 | | 30 | 1500 | 668.331255192114 | | 30 | 950 | 668.331255192114 | | 30 | 1600 | 668.331255192114 | | 30 | 1250 | 668.331255192114 | | 30 | 1250 | 668.331255192114 | | 30 | 2850 | 668.331255192114 | +------------+------------+------------+ -
Örnek 2: Departmana (deptno) göre bölümleyin, maaşın (sal) örnek standart sapmasını hesaplayın ve sonuçları sıralayın. İşlev, mevcut bölümün (aynı deptno değerine sahip satırlar) ilk satırından mevcut satıra kadar olan kümülatif örnek standart sapmasını döndürür. Komut aşağıdaki gibidir:
select deptno, sal, stddev_samp(sal) over (partition by deptno order by sal) from emp;Aşağıdaki sonuç döndürülür:
+------------+------------+------------+ | deptno | sal | _c2 | +------------+------------+------------+ | 10 | 1300 | 0.0 | -- First row of the window. | 10 | 1300 | 0.0 | -- Cumulative sample standard deviation from the first to the second row. | 10 | 2450 | 663.9528095680697 | -- Cumulative sample standard deviation from the first to the third row. | 10 | 2450 | 663.9528095680696 | | 10 | 5000 | 1511.2081259707413 | | 10 | 5000 | 1693.7138680032904 | | 20 | 800 | 0.0 | | 20 | 1100 | 212.13203435596427 | | 20 | 2975 | 1178.7175234126282 | | 20 | 3000 | 1182.7536725793752 | | 20 | 3000 | 1123.3320969330487 | | 30 | 950 | 0.0 | | 30 | 1250 | 212.13203435596427 | | 30 | 1250 | 173.20508075688772 | | 30 | 1500 | 225.0 | | 30 | 1600 | 253.4758371127315 | | 30 | 2850 | 668.331255192114 | +------------+------------+------------+
-
SUM
-
Sözdizimi
sum([distinct] <expr>) over ([partition_clause] [orderby_clause] [frame_clause]) -
Açıklama
Bir pencere içindeki expr toplamını döndürür.
-
Parametreler
-
expr: Gereklidir. Toplamın hesaplanacağı sütundur. DOUBLE, DECIMAL veya BIGINT türünde olmalıdır.
Giriş değeri STRING türündeyse, hesaplama için örtük olarak DOUBLE türüne dönüştürülür. Diğer veri türleri için hata döndürülür.
Giriş değeri NULL ise, satır hesaplamaya dahil edilmez.
distinct anahtar sözcüğünü belirtirseniz, işlev benzersiz değerlerin toplamını hesaplar.
partition_clause, orderby_clause ve frame_clause: Daha fazla bilgi için bkz. windowing_definition.
-
-
Dönüş değeri
Giriş değeri BIGINT türündeyse BIGINT değeri döndürülür.
Giriş değeri DECIMAL türündeyse DECIMAL değeri döndürülür.
Giriş değeri DOUBLE veya STRING türündeyse DOUBLE değeri döndürülür.
Tüm giriş değerleri NULL ise NULL döndürülür.
-
Örnekler
-
Örnek 1: Departmana (deptno) göre bölümleyin, maaşın (sal) toplamını hesaplayın ve sıralama yapmayın. İşlev, mevcut bölümün (aynı deptno değerine sahip satırlar) kümülatif toplamını döndürür. Komut aşağıdaki gibidir:
select deptno, sal, sum(sal) over (partition by deptno) from emp;Aşağıdaki sonuç döndürülür:
+------------+------------+------------+ | deptno | sal | _c2 | +------------+------------+------------+ | 10 | 1300 | 17500 | -- First row of the window. The value is the cumulative sum from the first to the sixth row. | 10 | 2450 | 17500 | -- The value is the cumulative sum from the first to the sixth row. | 10 | 5000 | 17500 | -- The value is the cumulative sum from the first to the sixth row. | 10 | 1300 | 17500 | | 10 | 5000 | 17500 | | 10 | 2450 | 17500 | | 20 | 3000 | 10875 | | 20 | 3000 | 10875 | | 20 | 800 | 10875 | | 20 | 1100 | 10875 | | 20 | 2975 | 10875 | | 30 | 1500 | 9400 | | 30 | 950 | 9400 | | 30 | 1600 | 9400 | | 30 | 1250 | 9400 | | 30 | 1250 | 9400 | | 30 | 2850 | 9400 | +------------+------------+------------+ -
Örnek 2: Hive uyumlu olmayan modda, departmana (deptno) göre bölümleyin, maaşın (sal) toplamını hesaplayın ve sonuçları sıralayın. İşlev, mevcut bölümün (aynı deptno değerine sahip satırlar) ilk satırından mevcut satıra kadar olan kümülatif toplamını döndürür. Komutlar aşağıdaki gibidir:
-- Disable Hive compatible mode. set odps.sql.hive.compatible=false; -- Execute the following SQL command. select deptno, sal, sum(sal) over (partition by deptno order by sal) from emp;Aşağıdaki sonuç döndürülür:
+------------+------------+------------+ | deptno | sal | _c2 | +------------+------------+------------+ | 10 | 1300 | 1300 | -- First row of the window. | 10 | 1300 | 2600 | -- Cumulative sum from the first to the second row. | 10 | 2450 | 5050 | -- Cumulative sum from the first to the third row. | 10 | 2450 | 7500 | | 10 | 5000 | 12500 | | 10 | 5000 | 17500 | | 20 | 800 | 800 | | 20 | 1100 | 1900 | | 20 | 2975 | 4875 | | 20 | 3000 | 7875 | | 20 | 3000 | 10875 | | 30 | 950 | 950 | | 30 | 1250 | 2200 | | 30 | 1250 | 3450 | | 30 | 1500 | 4950 | | 30 | 1600 | 6550 | | 30 | 2850 | 9400 | +------------+------------+------------+ -
Örnek 3: Hive uyumlu modda, departmana (deptno) göre bölümleyin, maaşın (sal) toplamını hesaplayın ve sonuçları sıralayın. İşlev, mevcut satırla aynı değere sahip satıra kadar olan kümülatif toplamını döndürür (aynı sal değerine sahip satırların toplamı aynıdır). Komutlar aşağıdaki gibidir:
-- Enable Hive compatible mode. set odps.sql.hive.compatible=true; -- Execute the following SQL command. select deptno, sal, sum(sal) over (partition by deptno order by sal) from emp;Aşağıdaki sonuç döndürülür:
+------------+------------+------------+ | deptno | sal | _c2 | +------------+------------+------------+ | 10 | 1300 | 2600 | -- First row of the window. Since the sal of the first and second rows are the same, the sum for the first row is the cumulative sum of the first two rows. | 10 | 1300 | 2600 | -- Cumulative sum from the first to the second row. | 10 | 2450 | 7500 | -- Since the sal of the third and fourth rows are the same, the sum for the third row is the cumulative sum of the firstfour rows. | 10 | 5000 | 17500 | | 10 | 5000 | 17500 | | 20 | 800 | 800 | | 20 | 1100 | 1900 | | 20 | 2975 | 4875 | | 20 | 3000 | 10875 | | 20 | 3000 | 10875 | | 30 | 950 | 950 | | 30 | 1250 | 3450 | | 30 | 1250 | 3450 | | 30 | 1500 | 4950 | | 30 | 1600 | 6550 | | 30 | 2850 | 9400 | +------------+------------+------------+
-
Başvurular
Yerleşik işlevler ihtiyaçlarınızı karşılamazsa kullanıcı tanımlı işlevler oluşturabilirsiniz. MaxCompute UDF'lerine genel bakış.
-
Yaygın MaxCompute SQL sorunları:
-
Yerleşik işlevler için yaygın hata kodları: