Ketika saya memiliki masalah yang sama, akhirnya saya menggunakan tabel temp untuk berbagai alasan, tapi ini membuat ini jauh lebih mudah. Apa yang saya lakukan terlihat sangat mirip dengan apa yang Anda lakukan, sejauh skema berjalan. Jadikan skema itu seperti identitas ID, startdate, enddate, value. Bila Anda memilih, lakukan subselect avg dari 20 sebelumnya berdasarkan ID identitas. Lakukan ini saja jika Anda sudah menggunakan tabel sementara karena alasan lain sekalipun (saya terus menabrak baris yang sama berulang-ulang untuk berbagai metrik, jadi ada gunanya memiliki kumpulan data kecil). Menurut pengalaman saya, Mysql pada 5.5.x cenderung tidak menggunakan indeks bergantung pada pilihan, apakah subkueri atau bergabung. Hal ini dapat memiliki dampak yang sangat signifikan terhadap kinerja di mana perubahan kriteria tergantung tergantung pada setiap baris. Rata-rata pergerakan adalah contoh kueri yang termasuk dalam kategori ini. Waktu eksekusi bisa meningkat dengan kuadrat baris. Untuk menghindarinya, pilihlah sebuah database engine yang bisa melakukan indexed look-up pada dependent select. Saya menemukan postgres bekerja efektif untuk masalah ini. Dijawab Jul 2 14 at 8:01 Jawaban Anda 2017 Stack Exchange, Dengan menggunakan moving average sederhana untuk memperlancar data adalah teknik yang cukup populer. Terlalu buruk contoh utama di SQL Anywhere Help adalah jauh dari sederhana: Apa yang membuat contoh itu begitu rumit Selain pernyataan masalah, yaitu: menghitung rata-rata pergerakan semua penjualan produk, per bulan, pada tahun 2000. Heres apa yang membuat Ini kompleks: dua referensi ke fungsi AVG (), GROUP BY (yang semuanya dengan sendirinya membuat kira-kira SELECT a head-scratcher),. Klausa WINDOW stealth klausa WINDOW yang bahkan tidak menggunakan kata kunci WINDOW. Jadi bagi yang belum tahu (orang-orang yang membutuhkan contoh lebih dari orang lain) tidaklah jelas bahwa WINDOW terlibat sama sekali. Tidak hanya klausa WINDOW, ingatlah, tapi satu yang mencakup setiap komponen yang bisa Anda catat di WINDOW: PARTITION BY, sebuah klausa RANGE. Bukan klausa ROWS sederhana tapi klausa RANGE full-blown, yang memiliki hubungan intim dengan ORDER BY. Aku tahu apa itu baris, tapi apa yang redaktur adalah RANGE Tapi tunggu, masih ada lagi: Pilihan RANGE over ROWS dalam contoh ini sangat penting untuk operasi kueri yang benar. (Untuk pembahasan yang lebih lengkap mengenai contoh khusus ini, lihat Contoh 23 - Menghitung Pindah Rata-rata di Glenn Paulleys kertas putih OLAP yang sangat bagus.) Sekarang, mari kembali ke jalur: Pindah Bergerak Benar-benar Sederhana Contoh berikut menampilkan 10 hari senilai Data bersama dengan rata-rata pergerakan nilai todays dan kemarin: Klausul WINDOW pada baris 21 sampai 23 mendefinisikan jendela bergerak yang berisi dua baris: baris todays (CURRENT ROW) dan baris kemarin (1 PRECEDING): klausul WINDOW ORDER BY menentukan apa PRECEDING berarti (baris sebelumnya dengan t. entrydate) dan klausa ROWS menentukan ukuran jendela (selalu dua baris). Ekspresi AVG (t. value) OVER twodays on line 19 mengacu pada klausa WINDOW dengan nama, dan ini memberitahu SQL Anywhere untuk menghitung rata-rata dua nilai nilai yang ada di jendela geser 2 baris, untuk masing-masing Baris di set hasil. Jadi, untuk 2012-02-02 rata-rata 10 dan 20 adalah 15.000000, untuk 2012-02-03 rata-rata 20 dan 10 adalah 15.000000, untuk 2012-02-04 rata-rata 10 dan 30 adalah 20.000000, untuk 2012- 02-10 rata-rata 10 dan 60 adalah 35.000000. Ups, bagaimana dengan baris pertama Baris 2012-02-01 tidak memiliki baris PRECEDING, jadi berapa rata-rata di atas jendela bergerak Menurut kertas putih Glenn Paulleys dalam kasus jendela yang bergerak, diasumsikan bahwa baris yang berisi Null Nilai ada sebelum baris pertama, dan setelah baris terakhir, di masukan. Itu berarti ketika jendela bergerak memiliki 2012-02-01 sebagai ROW CURRENT, baris 1 PRECEDING berisi nilai NULL. Dan ketika SQL Anywhere menghitung AVG () yang mencakup nilai NULL, itu tidak menghitung NULL sama sekali. Tidak dalam pembilang atau penyebut saat menghitung rata-rata. Heres proof: Thats why twodayaverage 10.000000 untuk baris pertama 2012-02-01. Diposting oleh Breck Carter at 3:47 PMIn saya baru-baru ini berbicara di Surge dan Percona Live tentang deteksi kesalahan adaptif (slide), saya mengklaim bahwa ambang batas hardcoded untuk mengingatkan tentang kondisi kesalahan biasanya terbaik untuk menghindari mendukung ambang dinamis atau adaptif. (Saya benar-benar melangkah lebih jauh dari itu dan mengatakan bahwa kemungkinan untuk mendeteksi kesalahan dengan sangat percaya diri pada banyak sistem seperti MySQL, tanpa menetapkan ambang sama sekali.) Di posting ini saya ingin menjelaskan sedikit lebih banyak tentang rata-rata bergerak yang saya gunakan untuk Menentukan perilaku normal dalam contoh yang saya berikan. Ada dua kandidat yang jelas untuk bergerak rata-rata: rata-rata bergerak langsung dan rata-rata bergerak tertimbang secara eksponensial. Rata-rata bergerak langsung hanya menghitung rata-rata (rata-rata) dari sampel data terakhir N. Dalam kasus saya, saya menggunakan 60 sampel. Ini memerlukan penyimpanan sampel N sebelumnya dan memperbarui rata-rata untuk setiap sampel. Rata-rata bergerak eksponensial tidak memerlukan sampel tetap. Rata-rata adalah satu nomor dan Anda memiliki faktor pemulusan yang disebut. Untuk setiap sampel baru, Anda mengalikan rata-rata lama dengan 1- dan kemudian menambahkannya ke sampel baru: avg: (1-alpha) avg alphasample. Kedua teknik tersebut memiliki kelemahan. Keduanya memerlukan periode pemanasan, misalnya. Jelas, dalam kasus jendela bergerak 60 sampel, Anda memerlukan 60 sampel sebelum Anda dapat memulai. Rata-rata pergerakan eksponensial dapat prima dari mean dari 10 sampel pertama, menurut pengalaman saya. Kedua teknik tersebut juga tidak mengikuti tren dalam sampel sampai batas tertentu. Bila ada perubahan dramatis dalam pola ini, mereka butuh beberapa saat untuk mengejar ketinggalan. Heres sebidang beberapa data nyata dan dua teknik. Klik untuk melihat gambar yang lebih besar. Garis biru adalah data sampel, garis merah adalah rata-rata bergerak eksponensial dengan memori 60 detik rata-rata, dan garis kuning adalah rata-rata bergerak 60 detik. Perhatikan bagaimana garis merah cenderung ke arahnya-perbaiki dengan lebih cepat dan tetaplah lebih sesuai dengan perilaku garis biru saat ini. Ini adalah salah satu keuntungan dari moving average eksponensial jika itu yang Anda inginkan. Ini tidak jelas dalam data ini, namun rata-rata pergerakan sederhana memiliki kelemahan lain. Misalkan ada lonjakan nilai yang sangat tinggi dalam data sampel selama beberapa detik. Selama 60 detik berikutnya, lonjakan ini akan berada di dalam jendela, menggembungkan rata-rata bergerak. Bila dibuang dari jendela, hal itu menyebabkan rata-rata bergerak turun tiba-tiba. Saya telah menemukan ini menjadi masalah dalam beberapa kasus. Ini sangat jelas ketika Anda menghitung standar deviasi sampel (atau statistik sensitif lainnya) di atas jendela bergerak. Rata-rata bergerak eksponensial tidak memiliki masalah karena lonjakan tidak bergerak keluar dari jendela. Pengaruhnya ada selamanya tapi seiring berjalannya waktu, secara bertahap menjadi lebih kecil, dengan mulus. Jadi Anda tidak mendapatkan lonjakan mendadak dalam rata-rata saat ini berdasarkan apa yang terjadi 60 detik yang lalu. Ini hanya menggores permukaan teknik yang telah saya jelajahi dalam beberapa hari hingga beberapa minggu data dari puluhan ribu server sebenarnya. Seiring saya mendapatkan waktu, saya mencoba menulis lebih banyak tentang hal itu di masa depan.
No comments:
Post a Comment