ในฐานข้อมูลของธุรกรรมที่ครอบคลุม 1,000 กิจการในระยะเวลา 18 เดือนฉันต้องการเรียกใช้แบบสอบถามเพื่อจัดกลุ่มทุกช่วงเวลา 30 วันที่เป็นไปได้โดยentity_id
ใช้ SUM ของจำนวนธุรกรรมและ COUNT ของธุรกรรมในช่วง 30 วันนั้นและ คืนค่าข้อมูลในวิธีที่ฉันสามารถสอบถามได้ หลังจากการทดสอบจำนวนมากรหัสนี้บรรลุสิ่งที่ฉันต้องการ:
SELECT id, trans_ref_no, amount, trans_date, entity_id,
SUM(amount) OVER(PARTITION BY entity_id, date_trunc('month',trans_date) ORDER BY entity_id, trans_date ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) AS trans_total,
COUNT(id) OVER(PARTITION BY entity_id, date_trunc('month',trans_date) ORDER BY entity_id, trans_date ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) AS trans_count
FROM transactiondb;
และฉันจะใช้ในแบบสอบถามที่มีโครงสร้างขนาดใหญ่กว่าเช่น:
SELECT * FROM (
SELECT id, trans_ref_no, amount, trans_date, entity_id,
SUM(amount) OVER(PARTITION BY entity_id, date_trunc('month',trans_date) ORDER BY entity_id, trans_date ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) AS trans_total,
COUNT(id) OVER(PARTITION BY entity_id, date_trunc('month',trans_date) ORDER BY entity_id, trans_date ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) AS trans_count
FROM transactiondb ) q
WHERE trans_count >= 4
AND trans_total >= 50000;
กรณีที่แบบสอบถามนี้ไม่ครอบคลุมคือเมื่อการนับธุรกรรมจะครอบคลุมหลายเดือน แต่ยังคงอยู่ภายใน 30 วันนับจากวันอื่น แบบสอบถามชนิดนี้เป็นไปได้กับ Postgres หรือไม่ ถ้าเป็นเช่นนั้นฉันยินดีต้อนรับการป้อนข้อมูลใด ๆ หลายหัวข้ออื่น ๆ พูดคุยกัน " ทำงาน " มวลรวมไม่กลิ้ง
ปรับปรุง
CREATE TABLE
สคริปต์:
CREATE TABLE transactiondb (
id integer NOT NULL,
trans_ref_no character varying(255),
amount numeric(18,2),
trans_date date,
entity_id integer
);
ข้อมูลตัวอย่างสามารถพบได้ที่นี่ ฉันใช้ PostgreSQL 9.1.16
ผลลัพธ์ในอุดมคติจะรวมSUM(amount)
และCOUNT()
ธุรกรรมทั้งหมดในช่วงเวลา 30 วัน ดูภาพนี้เช่น:
การเน้นวันที่สีเขียวแสดงว่าข้อความค้นหาของฉันถูกรวมไว้ในสิ่งใด การเน้นแถวสีเหลืองหมายถึงบันทึกสิ่งที่ฉันต้องการเป็นส่วนหนึ่งของชุด
อ่านก่อนหน้า:
entity_id
ในหน้าต่าง 30 วันโดยเริ่มจากแต่ละธุรกรรมจริง สามารถมีธุรกรรมหลายรายการในชุดเดียวกัน(trans_date, entity_id)
หรือชุดค่าผสมนั้นมีลักษณะเฉพาะได้หรือไม่? คำจำกัดความของตารางของคุณไม่มีUNIQUE
ข้อ จำกัด หรือ PK แต่ดูเหมือนว่าข้อ จำกัด จะหายไป ...
id
คีย์หลัก สามารถมีธุรกรรมได้หลายรายการต่อเอนทิตีต่อวัน
every possible 30-day period by entity_id
ที่คุณหมายถึงระยะเวลาที่สามารถเริ่มต้นใด ๆวันดังนั้น 365 ระยะเวลาที่เป็นไปได้ในปี (ยังไม่ได้ก้าวกระโดด)? หรือคุณต้องการที่จะพิจารณาวันที่มีการทำธุรกรรมจริงเป็นจุดเริ่มต้นของช่วงเวลาสำหรับแต่ละคนentity_id
? โปรดระบุคำนิยามตารางของคุณรุ่น Postgres ข้อมูลตัวอย่างบางส่วนและผลลัพธ์ที่คาดหวังสำหรับตัวอย่าง