ในฐานข้อมูลของธุรกรรมที่ครอบคลุม 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 ข้อมูลตัวอย่างบางส่วนและผลลัพธ์ที่คาดหวังสำหรับตัวอย่าง