JSON data modelling - prayagupa/rdb GitHub Wiki
create table event(
event_id int primary key,
event JSON
);
insert into event values(1, '{"event_type": "ad_sent", "ad_id": 1, "user_device_id": 1}');
insert into event values(2, '{"event_type": "ad_opened", "ad_id": 1, "user_device_id": 1, "opened_at": "2019-06-10"}');
insert into event values(3, '{"event_type": "ad_seen", "ad_id": 1, "user_device_id": 1, "seen_at": "2019-06-10"}');
mysql> select * from event;
+----------+-----------------------------------------------------------------------------------------+
| event_id | event |
+----------+-----------------------------------------------------------------------------------------+
| 1 | {"ad_id": 1, "event_type": "ad_sent", "user_device_id": 1} |
| 2 | {"ad_id": 1, "opened_at": "2019-06-10", "event_type": "ad_opened", "user_device_id": 1} |
| 3 | {"ad_id": 1, "seen_at": "2019-06-10", "event_type": "ad_seen", "user_device_id": 1} |
+----------+-----------------------------------------------------------------------------------------+
3 rows in set (0.00 sec)
mysql> select event->"$.ad_id", event->"$.user_device_id" from event;
+------------------+---------------------------+
| event->"$.ad_id" | event->"$.user_device_id" |
+------------------+---------------------------+
| 1 | 1 |
| 1 | 1 |
| 1 | 1 |
+------------------+---------------------------+
3 rows in set (0.00 sec)
-- search by event_type (present on all)
mysql> select event->"$.ad_id" adv_id, event->"$.user_device_id" user from event where event->"$.event_type" = "ad_sent";
+--------+------+
| adv_id | user |
+--------+------+
| 1 | 1 |
+--------+------+
1 row in set (0.00 sec)
-- search by "seen_at" which is only present for seen events
mysql> select event->"$.ad_id" adv_id, event->"$.user_device_id" user from event where event->"$.seen_at" = "2019-06-10";
+--------+------+
| adv_id | user |
+--------+------+
| 1 | 1 |
+--------+------+
1 row in set (0.01 sec)
https://dev.mysql.com/doc/refman/8.0/en/char.html
mysql> select distinct(warehouse) from Inventory;
+-----------+
| warehouse |
+-----------+
| De Moines |
| Seattle |
| Luyata |
+-----------+
3 rows in set (0.01 sec)
mysql> with w as (select warehouse, min(qty) qty from Inventory group by warehouse) select w.warehouse, w.qty from w;
+-----------+------+
| warehouse | qty |
+-----------+------+
| De Moines | 88 |
| Seattle | 99 |
| Luyata | 11 |
+-----------+------+
3 rows in set (0.01 sec)
mysql> with w as (select warehouse, min(qty) qty from Inventory group by warehouse) select i.warehouse, i.sku, i.qty from w join Inventory i on w.warehouse = i.warehouse and w.qty=i.qty;
+-----------+-------+------+
| warehouse | sku | qty |
+-----------+-------+------+
| De Moines | sku-1 | 88 |
| Seattle | sku-2 | 99 |
| Luyata | sku-3 | 11 |
+-----------+-------+------+
3 rows in set (0.00 sec)
index in timestamp with time zone
,
CREATE INDEX event__event_tstz__inverse_idx
ON eventstream (event_tstz DESC);
If its just timestamp
,
CREATE INDEX event__event_ts__idx
ON eventstream ((event_ts::DATE));