Tuesday 11 July 2017

การย้าย ค่าเฉลี่ย ใน sql แบบสอบถาม


นี่คือ Evergreen Joe Celko คำถามฉันไม่สนใจที่ใช้แพลตฟอร์ม DBMS แต่ในกรณีใด Joe สามารถตอบมากกว่า 10 ปีที่ผ่านมากับ SQL. Joe มาตรฐาน Celko SQL ปริศนาและคำตอบอ้างอิงที่พยายามปรับปรุงครั้งล่าสุดแสดงให้เห็นว่าเราสามารถใช้คำกริยา เพื่อสร้างแบบสอบถามที่จะทำให้เรามีค่าเฉลี่ยเคลื่อนที่เป็นคอลัมน์พิเศษหรือวิธีการสืบค้นที่ดีกว่าแบบสอบถามเป็นเทคนิคที่ดีกว่าเนื่องจากวิธีการ UPDATE จะ denormalize ฐานข้อมูล แต่ถ้าข้อมูลทางประวัติศาสตร์ที่ถูกบันทึกไว้จะไม่เปลี่ยนแปลงและคำนวณ ค่าเฉลี่ยเคลื่อนที่มีราคาแพงคุณอาจลองใช้วิธีการของคอลัมน์ SQL แบบสอบถามปริศนาทั้งหมดโดยใช้เครื่องแบบคุณเพียงแค่โยนไปยังถังน้ำหนักที่เหมาะสมขึ้นอยู่กับระยะทางจากจุดเวลาปัจจุบันตัวอย่างเช่นใช้น้ำหนัก 1 สำหรับจุดข้อมูลภายใน 24 ชั่วโมงจากจุดข้อมูลปัจจุบัน น้ำหนัก 0 5 สำหรับ datapoints ภายใน 48hrs กรณีนี้มีความสำคัญว่า datapoints ติดต่อกันอย่างเช่น 6 12am และ 11 48pm อยู่ไกลจากกันกรณีการใช้งาน I c คิดว่าจะพยายามที่จะราบรื่น histogram ที่ใดก็ตามที่ datapoints ไม่หนาพอ msciwoj 27 พฤษภาคม 15 ที่ 22 22.I m ไม่แน่ใจว่าผลลัพธ์ผลลัพธ์ที่คาดหวังของคุณแสดงให้เห็นถึงคลาสสิกที่เรียบง่ายกลิ้งเฉลี่ย 3 วันเนื่องจากตัวอย่างเช่นครั้งแรก สามตัวเลขตามความหมายให้ แต่คุณคาดหวัง 4 360 และมันสับสนอย่างไรก็ตามผมขอแนะนำโซลูชันต่อไปนี้ซึ่งใช้ AVG หน้าต่างฟังก์ชันวิธีนี้มีประสิทธิภาพมากขึ้นชัดเจนและทรัพยากรน้อยกว่า SELF-JOIN แนะนำในอื่น ๆ คำตอบและฉันประหลาดใจที่ไม่มีใครได้ให้ทางออกที่ดีขึ้นคุณเห็นว่า AVG ถูกห่อด้วยกรณีเมื่อ rownum แล้วบังคับให้ NULL s ในแถวแรกที่ 3 วัน Moving Average มีความหมายตอบ 23 กุมภาพันธ์ 16 ที่ 13 12 เรา สามารถใช้โจ Celko s ด้านซ้ายซ้ายสกปรกวิธีการเข้าร่วมตามที่อ้างถึงข้างต้นโดย Diego Scaravaggi เพื่อตอบคำถามตามที่ถามได้สร้างผลลัพธ์ที่ต้องการตอบ Jan 9 16 ที่ 0 33.Your Answer.2017 Stack Exchange, Inc. I am working กับ SQL Server 2008 R2 พยายามคำนวณค่าเฉลี่ยเคลื่อนที่สำหรับแต่ละเร็กคอร์ดในมุมมองของฉันฉันต้องการเก็บค่าของระเบียนก่อนหน้า 250 รายการและคำนวณค่าเฉลี่ยสำหรับคอลัมน์ที่เลือกนี้คอลัมน์ของฉันมีดังนี้.TransactionIDไม่ซ้ำกันสำหรับแต่ละ TransactionID ฉัน ต้องการคำนวณค่าเฉลี่ยสำหรับค่าของคอลัมน์มากกว่า 250 ระเบียนก่อนหน้าดังนั้นสำหรับ TransactionID 300 ให้รวบรวมค่าทั้งหมดจากมุมมอง 250 แถวก่อนหน้านี้จะถูกเรียงลำดับจากมากไปน้อยโดย TransactionID จากนั้นในคอลัมน์ MovAvg จะเขียนค่าเฉลี่ยของค่าเหล่านี้ที่ฉันต้องการ รวบรวมข้อมูลภายในช่วงของ records. asked Oct 28 14 at 20 58 การใช้ค่าเฉลี่ยเคลื่อนที่แบบเรียบเพื่อให้ข้อมูลที่ราบรื่นขึ้นเป็นเทคนิคที่ค่อนข้างเป็นที่นิยมมากเกินไปตัวอย่างที่เลวร้ายที่สุดใน SQL Anywhere Help อยู่ไกลจากง่ายสิ่งที่ทำให้ตัวอย่างนั้น ซับซ้อนเกินไปนอกจากคำสั่งปัญหาที่คำนวณค่าเฉลี่ยเคลื่อนที่ของการขายผลิตภัณฑ์ทั้งหมดโดยเดือนในปี 2000.Here สิ่งที่ทำให้การอ้างอิง complex. two สอง AVG function. a GROUP BY ซึ่งทั้งหมดโดย ตัวเองทำเพียงเกี่ยวกับใด ๆ SELECT หัว scratcher วลีซ่อน WINDOW clause. a ประโยค WINDOW ที่ doesn t แม้ใช้คำหลัก WINDOW เพื่อไม่ได้ฝึกหัด folks ที่ต้องการตัวอย่างมากขึ้นกว่าคนอื่นมัน ISN T เห็นได้ชัดว่ามีส่วนเกี่ยวข้องที่ทุกคนไม่เพียงประโยค WINDOW ใด ๆ ใจคุณ, แต่หนึ่งที่มีทุกองค์ประกอบเดียวคุณสามารถรหัส WINDOW. a PARTITION BY. a ประโยค RANGE ไม่ประโยค ROWS ง่าย แต่ประโยค RANGE เต็มเป่าหนึ่งที่มีความสนิทสนมกับ ORDER BY ฉันรู้ว่าแถวเป็น, แต่สิ่งที่ redacted คือ RANGE แต่รอมีมากขึ้นการเลือก RANGE ใน ROWS ในตัวอย่างนี้มีความสำคัญต่อการดำเนินการที่ถูกต้องของแบบสอบถามเพื่อการอภิปรายที่สมบูรณ์มากขึ้นในตัวอย่างเฉพาะนี้ดูตัวอย่างที่ 23 - การคำนวณค่าเฉลี่ยเคลื่อนที่ ในกระดาษสีขาว OLAP ที่ยอดเยี่ยมของ Glenn Paulley ตอนนี้ขอให้ย้อนกลับไปดูค่าเฉลี่ย Average Moving Average จริงๆตัวอย่างต่อไปนี้แสดงข้อมูลมูลค่า 10 วันพร้อมกับค่าเฉลี่ยเคลื่อนที่ของค่าวันนี้และเมื่อวานนี้เป็นบรรทัด WINDOW ในบรรทัด 21 ถึง 23 กำหนดหน้าต่างเคลื่อนที่ที่มีแถวสองแถวแถวปัจจุบันแถว ROW ปัจจุบันและแถวที่เมื่อวานนี้ 1 PRECEDING. WINDOW ORDER BY กำหนดว่า PRECEDING หมายถึงแถวก่อนหน้าด้วยประโยค and. the ROWS กำหนดขนาดของหน้าต่างเสมอสองแถวการแสดงออก AVG Over twodays ในบรรทัดที่ 19 อ้างถึงคำสั่ง WINDOW ตามชื่อและบอก SQL Anywhere เพื่อคำนวณค่าเฉลี่ยของค่าสองค่าที่มีอยู่ในหน้าต่างเลื่อน 2 แถวสำหรับแต่ละแถวในชุดผลลัพธ์ดังนั้นสำหรับ 2012 -02-02 ค่าเฉลี่ย 10 และ 20 คือ 15 000000.for 2012-02-03 ค่าเฉลี่ย 20 และ 10 คือ 15 000000.for 2012-02-04 ค่าเฉลี่ย 10 และ 30 คือ 20 000000.for 2012-02 -10 ค่าเฉลี่ยของ 10 และ 60 คือ 35 000000.Oops สิ่งที่เกี่ยวกับแถวแรกแถว 2012/02/01 ไม่ได้มีแถวที่กำหนดดังนั้นค่าเฉลี่ยของหน้าต่างที่เคลื่อนที่ตาม Glenn Paulley คือสีขาว กระดาษในกรณีของหน้าต่างเคลื่อนที่จะสันนิษฐานว่าแถวที่มีค่า Null อยู่ก่อนแถวแรกและหลังจากแถวสุดท้ายใน inpu t นั่นหมายความว่าเมื่อหน้าต่างเคลื่อนที่มี 2012-02-01 เป็น CURRENT ROW แถว PRECEDING หนึ่งแถวมีค่า NULL และเมื่อ SQL Anywhere คำนวณ AVG ที่มีค่า NULL จะไม่นับ NULL ที่ไม่อยู่ใน เศษหรือในตัวหารเมื่อคำนวณค่าเฉลี่ยนี่คือหลักฐานที่ว่าทำไม twodayaverage 10 000000 สำหรับแถวแรก 2012-02-01 โพสต์โดย Breck Carter ที่ 3 47 PM

No comments:

Post a Comment