พิจารณาตารางที่บันทึกการเข้าชม
create table visits (
person varchar(10),
ts timestamp,
somevalue varchar(10)
)
พิจารณาข้อมูลตัวอย่างนี้ (การประทับเวลาประยุกต์เป็นตัวนับ)
ts| person | somevalue
-------------------------
1 | bob |null
2 | bob |null
3 | jim |null
4 | bob | A
5 | bob | null
6 | bob | B
7 | jim | X
8 | jim | Y
9 | jim | null
ฉันพยายามที่จะดำเนินการบางสิ่งบางอย่างที่ไม่ใช่โมฆะครั้งสุดท้ายของบุคคลเพื่อการเยี่ยมชมในอนาคตทั้งหมดของเขาจนกว่าการเปลี่ยนแปลงค่านั้น (เช่นกลายเป็นค่าที่ไม่ใช่โมฆะถัดไป)
ชุดผลลัพธ์ที่คาดหวังมีลักษณะดังนี้:
ts| person | somevalue | carry-forward
-----------------------------------------------
1 | bob |null | null
2 | bob |null | null
3 | jim |null | null
4 | bob | A | A
5 | bob | null | A
6 | bob | B | B
7 | jim | X | X
8 | jim | Y | Y
9 | jim | null | Y
ความพยายามของฉันมีลักษณะเช่นนี้:
select *,
first_value(somevalue) over (partition by person order by (somevalue is null), ts rows between UNBOUNDED PRECEDING AND current row ) as carry_forward
from visits
order by ts
หมายเหตุ: (somevalue เป็นโมฆะ) ประเมินเป็น 1 หรือ 0 สำหรับวัตถุประสงค์ในการเรียงลำดับเพื่อให้ฉันได้รับค่าที่ไม่ใช่ค่าแรกในพาร์ติชัน
ข้างต้นไม่ได้ให้ผลลัพธ์ตามที่ฉันต้องการ
pg_dump
ข้อมูลทดสอบของคุณแทนที่จะวางข้อมูลในเอาต์พุต psql และสคีมาสำหรับตารางได้หรือไม่pg_dump -t table -d database
เราต้องการสร้างและCOPY
คำสั่ง