รับเปอร์เซ็นไทล์ที่ 10 และ 90 จากลูกค้า


13

ฉันมีตารางที่มีลูกค้าและคะแนน (ขึ้นอยู่กับปัจจัยต่าง ๆ ที่ไม่เกี่ยวข้องในกรณีนี้ลูกค้าสามารถมีหลายคะแนน) ซึ่งมีลักษณะดังนี้:

customer_id | score | score_giver_id
====================================
          1 | 100   | 1
          1 | 102   | 1
          1 | 101   | 1
          1 | 140   | 1
          2 | 131   | 3
          1 | 44    | 1
          3 | 223   | 1
          3 | 1     | 2
          3 | 201   | 1
          3 | 211   | 1
          3 | 231   | 1
          3 | 243   | 1

score_giver_idไม่เกี่ยวข้อง แต่ฉันยังคงต้องการที่จะดึงมัน

ในตัวอย่างด้านบนเมื่อรับเปอร์เซ็นไทล์ที่ 50 จัดกลุ่มโดย customer_id ผลลัพธ์ควรเป็น (ฉันเลือกเปอร์เซ็นไทล์ที่ 50 ในตัวอย่างนี้เพราะมันแสดงให้เห็นว่าฉันต้องการทำอะไรได้ดีกว่า):

customer_id | score | score_giver_id
====================================
          1 | 101   | 1
          2 | 131   | 3
          3 | 223   | 1

ผมใช้วิธีการอธิบายที่นี่

ฉันต้องได้รับค่าที่ 10 เปอร์เซ็นต์ตามลำดับที่ 90 เปอร์เซ็นต์ใน PostgreSQL ฉันเคยเห็นว่าตั้งแต่ 9.4 มีntileฟังก์ชั่น แต่ฉันไม่เข้าใจว่ามันใช้งานได้จริงทำอย่างไรและถ้ามันช่วยฉันได้

ฉันพบข้อมูลโค้ดที่ดีสำหรับ MySQL ซึ่งใช้งานได้ (แม้ว่าจะมีคำเตือนอยู่บ้าง) แต่ฉันต้องการใช้ฟังก์ชั่นในตัวถ้ามี (สำหรับ MySQL ไม่มีเลยดังนั้นตัวอย่าง)

คำตอบ:


22

ดูเหมือนว่าคุณจะอยู่หลังpercentile_disc()ฟังก์ชั่นการรวมที่สั่งซื้อ

เอกสารกล่าวว่าต่อไปนี้เกี่ยวกับเรื่องนี้:

percentile_disc(fraction) WITHIN GROUP (ORDER BY sort_expression)

เปอร์เซ็นต์แยกแบบไม่ต่อเนื่อง: ส่งคืนค่าอินพุตแรกที่ตำแหน่งในการสั่งซื้อเท่ากับหรือสูงกว่าเศษส่วนที่ระบุ

ไวยากรณ์ค่อนข้างแปลกสำหรับการรวม แต่ใช้ง่าย:

SELECT percentile_disc(0.9) WITHIN GROUP (ORDER BY score)
  FROM customer_score
 GROUP BY customer_id;

คุณกำหนดคอลัมน์ที่จะใช้เปอร์เซ็นต์ไทล์ในORDER BYข้อ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.