Guest User

Untitled

a guest
Dec 12th, 2021
70
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.20 KB | None | 0 0
  1. create extension btree_gist;
  2. --DROP TABLE IF EXISTS events CASCADE;
  3. --DROP TABLE IF EXISTS event_buckets_5 CASCADE;
  4. CREATE TABLE events (
  5. id bigserial,
  6. starttime timestamp,
  7. endtime timestamp,
  8. data varchar,
  9. primary key(id)
  10. );
  11.  
  12. CREATE TABLE event_buckets_5(
  13. CHECK (bucket<=5),
  14. bucket integer null,
  15. event_id bigint not null references events(id),
  16. starttime timestamp,
  17. endtime timestamp,
  18. EXCLUDE USING gist(bucket with =, tsrange(starttime, endtime, '[)') WITH &&)
  19. );
  20.  
  21.  
  22. create function bucket_insert_event_inner(event events, bucket_number integer)
  23. RETURNS integer
  24. AS $$
  25. BEGIN
  26. insert into event_buckets_5 (bucket, event_id, starttime, endtime) values (bucket_number, event.id, event.starttime, event.endtime);
  27. return bucket_number;
  28. EXCEPTION
  29. WHEN exclusion_violation then
  30. return null;
  31. END
  32. $$ language plpgsql;
  33.  
  34. create function bucket_insert_event(event events, max_bucket_num integer)
  35. RETURNS integer
  36. AS $$
  37. DECLARE
  38. current_bucket_num integer := 1;
  39. inner_result integer;
  40. BEGIN
  41. WHILE current_bucket_num <= max_bucket_num LOOP
  42. inner_result = bucket_insert_event_inner(event, current_bucket_num);
  43. IF inner_result IS NOT NULL THEN
  44. return inner_result;
  45. END IF;
  46. current_bucket_num := current_bucket_num + 1;
  47. END LOOP;
  48. -- If we get here without having hit the return, we've never
  49. -- successfully inserted even up to max bucket num. Insert with null.
  50. insert into event_buckets_5 (bucket, event_id, starttime, endtime) values (null, event.id, event.starttime, event.endtime);
  51. return null;
  52. END
  53. $$ language plpgsql;
  54.  
  55.  
  56.  
  57. insert into events select nextval('events_id_seq'), '2021-12-12T00:00:00', '2021-12-12T00:10:00', '';
  58. select bucket_insert_event((select e from events e where id=1), 5);
  59.  
  60. insert into events select nextval('events_id_seq'), '2021-12-12T00:00:00', '2021-12-12T00:20:00', '';
  61. select bucket_insert_event((select e from events e where id=2), 5);
  62. insert into events select nextval('events_id_seq'), '2021-12-12T00:00:00', '2021-12-12T00:30:00', '';
  63. select bucket_insert_event((select e from events e where id=3), 5);
  64. insert into events select nextval('events_id_seq'), '2021-12-12T00:00:00', '2021-12-12T00:40:00', '';
  65. select bucket_insert_event((select e from events e where id=4), 5);
  66. insert into events select nextval('events_id_seq'), '2021-12-12T00:00:00', '2021-12-12T00:50:00', '';
  67. select bucket_insert_event((select e from events e where id=5), 5);
  68. insert into events select nextval('events_id_seq'), '2021-12-12T00:00:00', '2021-12-12T01:00:00', '';
  69. select bucket_insert_event((select e from events e where id=6), 5);
  70. insert into events select nextval('events_id_seq'), '2021-12-12T00:00:00', '2021-12-12T01:00:00', '';
  71. select bucket_insert_event((select e from events e where id=(select max(id) from events)), 5);
  72. insert into events select nextval('events_id_seq'), '2021-12-12T00:30:00', '2021-12-12T01:00:00', '';
  73. select bucket_insert_event((select e from events e where id=(select max(id) from events)), 5);
  74. insert into events select nextval('events_id_seq'), '2021-12-12T00:40:00', '2021-12-12T01:00:00', '';
  75. select bucket_insert_event((select e from events e where id=(select max(id) from events)), 5);
  76. insert into events select nextval('events_id_seq'), '2021-12-12T00:20:00', '2021-12-12T01:50:00', '';
  77. select bucket_insert_event((select e from events e where id=(select max(id) from events)), 5);
  78.  
  79. select * from event_buckets_5 order by ctid;
  80.  
  81. -- bucket | event_id | starttime | endtime
  82. -- --------+----------+---------------------+---------------------
  83. -- 1 | 1 | 2021-12-12 00:00:00 | 2021-12-12 00:10:00
  84. -- 2 | 2 | 2021-12-12 00:00:00 | 2021-12-12 00:20:00
  85. -- 3 | 3 | 2021-12-12 00:00:00 | 2021-12-12 00:30:00
  86. -- 4 | 4 | 2021-12-12 00:00:00 | 2021-12-12 00:40:00
  87. -- 5 | 5 | 2021-12-12 00:00:00 | 2021-12-12 00:50:00
  88. -- | 6 | 2021-12-12 00:00:00 | 2021-12-12 01:00:00
  89. -- | 7 | 2021-12-12 00:00:00 | 2021-12-12 01:00:00
  90. -- 1 | 8 | 2021-12-12 00:30:00 | 2021-12-12 01:00:00
  91. -- 2 | 9 | 2021-12-12 00:40:00 | 2021-12-12 01:00:00
  92. -- | 10 | 2021-12-12 00:20:00 | 2021-12-12 01:50:00
  93. -- (10 rows)
  94.  
Advertisement
Add Comment
Please, Sign In to add comment