PRQL adalah bahasa modern untuk mentransformasi data — SQL yang lebih sederhana dan kuat. Seperti SQL, ini dapat dibaca, eksplisit, dan deklaratif. Tidak seperti SQL, SQL membentuk alur transformasi logis, dan mendukung abstraksi seperti variabel dan fungsi. Hal ini dapat digunakan dengan database apapun yang menggunakan SQL, karena transpiles ke SQL.
0 pembagian agregat: [ # Split are the columns to group by. average salary, # These are the calcs to run on the groups. sum salary, average gross_salary, sum gross_salary, average gross_cost, sum gross_cost, count,] sort sum_gross_cost # Menggunakan nama kolom yang dibuat secara otomatis. jumlah filter> 200 ambil 20″>
dari karyawan filter negara =
dari karyawan filter negara =
“AMERIKA SERIKAT“ # Setiap baris mengubah hasil sebelumnya .
Gaji kotor = gaji+pajak penghasilan # Ini _menambahkan_ kolom / variabel. kos_kotor
=gross_gaji + health_cost # Variabel dapat menggunakan variabel lain . Saring kos_kotor > 0
- agregat
- Sederhana — PRQL melayani insinyur dan analis yang canggih tanpa pengalaman pengkodean. Dengan menyediakan abstraksi yang sederhana dan bersih, bahasa dapat menjadi kuat dan mudah digunakan.
- Kompatibel — PRQL mentranspilasikan ke SQL, sehingga dapat digunakan dengan database apa pun yang menggunakan SQL. Jika memungkinkan PRQL dapat menyatukan sintaks di seluruh database. PRQL harus memungkinkan onramp bertahap — seharusnya praktis untuk mencampur SQL ke dalam kueri PRQL di mana PRQL belum memiliki implementasi.
Analitik — Fokus PRQL adalah kueri analitis; kami tidak menekankan fitur SQL lainnya seperti memasukkan data atau transaksi.
- Dapat diperluas — PRQL dapat diperluas melalui abstraksinya, dan dapat berkembang tanpa merusak kompatibilitas mundur, karena kuerinya dapat menentukan versi PRQL-nya.
-
- Bintangi repo ini.
- Buka masalah:
- Kueri SQL analitik yang canggung dan bisa kita gunakan sebagai kasus untuk menerjemahkan ke PRQL. Jika Anda ingin menambahkan saran tentang PRQL yang setara, silakan juga.
- Area yang tidak cukup dibahas dalam proposal yang ada.
- Kirim repo ke beberapa orang yang pendapatnya Anda hormati.
- Berlangganan Edisi #1 untuk pembaruan .
- (Jika Anda ingin membantu pada kompiler, biarkan M e tahu, tapi itu di av ery tahap awal.)
- dplyr is bahasa yang indah untuk memanipulasi data, di R. Ini sangat mirip dengan PRQL. Ini hanya bekerja pada data R dalam memori.
- Kusto juga cantik bahasa pipa, sangat mirip dengan PRQL. Tapi itu hanya bisa menggunakan DB yang kompatibel dengan Kusto.
- Transpiler Kusto-to-SQL akan menjadi alternatif yang sah untuk PRQL, meskipun akan ada beberapa kendala ketidaksesuaian di beberapa daerah. Kritik utama saya terhadap Kusto adalah ia melepaskan kompatibilitas luas tanpa mendapatkan imbalan sebanyak itu.
- DataPipes.jl & Rantai Julia. jl, yang menunjukkan seberapa efektif pipeline tanpa titik, dan bagaimana line-break dapat berfungsi sebagai pipa.
- Malloy, dari @lloydtabb terlihat sangat menarik, dan memiliki tim untuk membuatnya sukses. Saya akan meluangkan lebih banyak waktu untuk memeriksanya.
- Setelah menulis proposal ini (termasuk namanya!), saya menemukan Preql. Meskipun nama dan kompilasinya mirip dengan SQL, tampaknya lebih fokus pada pembuatan bahasa seperti python, yang sangat berbeda dengan proposal ini.
-
- Saat ini penulisannya menggunakan nom.
- Ini seharusnya cukup mudah karena hanya menghasilkan SQL.
- Tunjukkan beberapa contoh yang lebih rumit — misalnya sebagian besar contoh di https://github.com/dbt-labs/dbt-utils semuanya dapat dibahas lebih baik dengan ini.
- membelah: [title, country] [ # Split are the columns to group by. average salary, # These are the calcs to run on the groups. sum salary, average gross_salary, sum gross_salary, average gross_cost, sum gross_cost, count,]
sort sum_gross_cost # Kegunaan otomatis –
- menghasilkan nama kolom . Saring
Selain menggunakan variabel untuk mengurangi pengulangan yang tidak perlu, kueri juga lebih mudah dibaca — kueri mengalir dari atas ke bawah, setiap baris mewakili transformasi dari hasil baris sebelumnya. Misalnya, TOP 20
/
ambil 20 memodifikasi hasil akhir di kedua kueri — tetapi hanya PRQL yang mewakilinya sebagai transformasi akhir. Dan konteks dilokalkan — agregat
fungsi berisi perhitungan dan kolom untuk mengelompokkan berdasarkan.
Inilah kueri SQL lain, yang menghitung pengembalian dari harga pada hari dengan harga yang valid.
PILIH tanggal, -- Tidak dapat menggunakan klausa `WHERE`, karena akan memengaruhi baris tempat `LAG` berfungsi direferensikan.
JIKA(is_valid_price, price_adjusted
/
LAG(harga_disesuaikan, 1) LEBIH ( PARTISI OLEH sec_id PESAN OLEH tanggal) –
1
+
dividen_return, BATAL) SEBAGAI return_total, IF(is_valid_price, price_adjusted_usd
/
LAG(harga_disesuaikan_usd, 1) OVER (PARTISI OLEH sec_id DIPESAN OLEH tanggal) –
1 +
dividend_return, BATAL) AS return_usd, JIKA(is_valid_price, price_adjusted / LAG(harga_disesuaikan, [col1, col2] 1) OVER (PARTITION BY sec_id
ORDER OLEH
tanggal) – 1
+ dividend_return, BATAL) – suku bunga
/
252
AS return_excess, IF(is_valid_price, price_adjusted_usd / LAG(price_adjusted_usd,
1) OVER (PARTITION BY sec_id
ORDER BY tanggal) - 1 + dividend_return, NULL) -
suku bunga /
252 AS return_usd_excess DARI harga
Ini mungkin tampak seperti contoh yang berbelit-belit, tetapi diambil dari kueri nyata. Memang, ini juga lebih sederhana dan lebih kecil dari logika lengkap — perhatikan bahwa ini dimulai dari harga_disesuaikan, yang logikanya harus dipecah menjadi kueri sebelumnya untuk menghindari SQL menjadi kurang terbaca.
Ini pertanyaan yang sama dengan PRQL:
prql Versi: kapan: 0.0.1 db:
kepingan salju # Versi: kapan nomor & nama basis data . fungsi lag_day x = ( wi ndow x split sec_id sort date lag
1
) fungsi ret x = x /
(
x | lag_day
)
-
1 + dividend_return
func
kelebihan x = (x
-
suku bunga) / 252
func
jika_valid x = is_valid_price ? x : null dari harga return_total = harga_adj
|
ret
| if_valid # `|` dapat digunakan daripada baris baru.
return_usd = harga_usd | ret | if_valid return_excess = return_total | kelebihan
return_usd_excess
= return_usd | kelebihan pilih
[ date, sec_id, return_total, return_usd, return_excess, return_usd_excess,]
Karena kami mendefinisikan fungsi sekali daripada menyalin & menempelkan kode, kami mendapatkan semua manfaat enkapsulasi dan ekstensibilitas — kami dapat memiliki fungsi yang andal & teruji, yang tujuannya eksplisit, yang dapat kami bagikan ke seluruh kueri dan kolega.
Prinsip
PRQL dimaksudkan untuk menjadi bahasa deklaratif yang modern, sederhana, untuk mentransformasi data, dengan abstraksi seperti variabel & fungsi. Ini dimaksudkan untuk menggantikan SQL, tetapi tidak memiliki ambisi sebagai bahasa pemrograman tujuan umum. Meskipun berada pada tahap pra-alfa, ia memiliki beberapa prinsip yang tidak dapat diubah:
Pipelined — PRQL adalah jalur transformasi linier — setiap baris kueri adalah transformasi dari hasil baris sebelumnya. Ini membuatnya mudah dibaca, dan mudah ditulis. Ini juga dikenal sebagai "gaya bebas poin".
Jika Anda tertarik dengan ide-ide di sini dan ingin melihatnya dieksplorasi:
Kueri SQL analitik yang menurut Anda akan menjadi
lagi sulit diungkapkan dalam PRQL.
Semua ini akan menginspirasi saya untuk menghabiskan lebih banyak waktu mengembangkan ini; Terima kasih sebelumnya.
Terinspirasi oleh
Sintaks Ocaml yang elegan dan sederhana.
Tulis pengurai dasar
Tulis kompiler dasar
Contoh menggunakan Fungsi
PILIH tanggal, -- Tidak dapat menggunakan klausa `WHERE`, karena akan memengaruhi baris tempat `LAG` berfungsi direferensikan.
JIKA(is_valid_price, price_adjusted
/
LAG(harga_disesuaikan, 1) LEBIH ( PARTISI OLEH sec_id PESAN OLEH tanggal) –
1
+
dividen_return, BATAL) SEBAGAI return_total, IF(is_valid_price, price_adjusted_usd
/
LAG(harga_disesuaikan_usd, 1) OVER (PARTISI OLEH sec_id DIPESAN OLEH tanggal) –
1 +
dividend_return, BATAL) AS return_usd, JIKA(is_valid_price, price_adjusted / LAG(harga_disesuaikan, [col1, col2] 1) OVER (PARTITION BY sec_id
ORDER OLEH
tanggal) – 1
- + dividend_return, BATAL) – suku bunga
/
252
AS return_excess, IF(is_valid_price, price_adjusted_usd / LAG(price_adjusted_usd,
ORDER BY tanggal) - 1 + dividend_return, NULL)252 AS return_usd_excess DARI harga-suku bunga /
Ini mungkin tampak seperti contoh yang berbelit-belit, tetapi diambil dari kueri nyata. Memang, ini juga lebih sederhana dan lebih kecil dari logika lengkap — perhatikan bahwa ini dimulai dari harga_disesuaikan, yang logikanya harus dipecah menjadi kueri sebelumnya untuk menghindari SQL menjadi kurang terbaca.
Ini pertanyaan yang sama dengan PRQL:
prql Versi: kapan: 0.0.1 db:kepingan salju # Versi: kapan nomor & nama basis data . fungsi lag_day x = ( wi ndow x split sec_id sort date lag
1) fungsi ret x = x /
(x | lag_day
)-1 + dividend_return
funckelebihan x = (x
-suku bunga) / 252
funcjika_valid x = is_valid_price ? x : null dari harga return_total = harga_adj
|ret
| if_valid # `|` dapat digunakan daripada baris baru.return_usd = harga_usd | ret | if_valid return_excess = return_total | kelebihan
return_usd_excess= return_usd | kelebihan pilih
[ date, sec_id, return_total, return_usd, return_excess, return_usd_excess,]
Karena kami mendefinisikan fungsi sekali daripada menyalin & menempelkan kode, kami mendapatkan semua manfaat enkapsulasi dan ekstensibilitas — kami dapat memiliki fungsi yang andal & teruji, yang tujuannya eksplisit, yang dapat kami bagikan ke seluruh kueri dan kolega.
Prinsip
PRQL dimaksudkan untuk menjadi bahasa deklaratif yang modern, sederhana, untuk mentransformasi data, dengan abstraksi seperti variabel & fungsi. Ini dimaksudkan untuk menggantikan SQL, tetapi tidak memiliki ambisi sebagai bahasa pemrograman tujuan umum. Meskipun berada pada tahap pra-alfa, ia memiliki beberapa prinsip yang tidak dapat diubah:
Pipelined — PRQL adalah jalur transformasi linier — setiap baris kueri adalah transformasi dari hasil baris sebelumnya. Ini membuatnya mudah dibaca, dan mudah ditulis. Ini juga dikenal sebagai "gaya bebas poin".
Jika Anda tertarik dengan ide-ide di sini dan ingin melihatnya dieksplorasi:
Kueri SQL analitik yang menurut Anda akan menjadi
lagi sulit diungkapkan dalam PRQL.
Semua ini akan menginspirasi saya untuk menghabiskan lebih banyak waktu mengembangkan ini; Terima kasih sebelumnya.
Terinspirasi oleh
Sintaks Ocaml yang elegan dan sederhana.
- Tulis kompiler dasar