当前设计
Table: 1_notes
------------------------------------------
| id | text | created_at |
------------------------------------------
| 1_1 | u1 first note | 2018-01-01 10:00:00 |
| 1_2 | u1 second note | 2018-01-03 10:00:00 |
Table: 1_note_timeline
---------------------------------------------------------------------
| note_id | note_created_at | likes_count | created_at |
---------------------------------------------------------------------
| 1_1 | 2018-01-01 10:00:00 | 10 | 2018-01-01 10:00:00 |
| 1_1 | 2018-01-01 10:00:00 | 20 | 2018-01-02 10:00:00 |
| 1_2 | 2018-01-03 10:00:00 | 10 | 2018-01-03 10:00:00 |
| 1_1 | 2018-01-01 10:00:00 | 15 | 2018-01-03 10:00:00 |
Table: 2_notes
--------------------------------------------
| id | text | created_at |
--------------------------------------------
| 2_1 | u2 first note | 2018-01-01 10:00:00 |
| 2_2 | u2 second note | 2018-01-03 10:00:00 |
Table: 2_note_timeline
---------------------------------------------------------------------
| note_id | note_created_at | likes_count | created_at |
---------------------------------------------------------------------
| 2_1 | 2018-01-01 10:00:00 | 10 | 2018-01-01 10:00:00 |
| 2_1 | 2018-01-01 10:00:00 | 20 | 2018-01-02 10:00:00 |
| 2_2 | 2018-01-03 10:00:00 | 10 | 2018-01-03 10:00:00 |
| 2_1 | 2018-01-01 10:00:00 | 15 | 2018-01-03 10:00:00 |
对于每个用户,其笔记数据有2个表。
userId
的用户的注释所需结果应具有:
最终输出
Output
---------------------------------------------------------------
| note_id | note_created_at | likes_count | text |
---------------------------------------------------------------
| 1_1 | 2018-01-01 10:00:00 | 15 | u1 first note |
| 2_1 | 2018-01-01 10:00:00 | 15 | u2 first note |
答案 0 :(得分:1)
以下是用于BigQuery标准SQL
#standardSQL
WITH `project.dataset.user_notes` AS (
SELECT * FROM `project.dataset.user1_notes` UNION ALL
SELECT * FROM `project.dataset.user2_notes`
), `project.dataset.user_note_timeline` AS (
SELECT * FROM `project.dataset.user1_note_timeline` UNION ALL
SELECT * FROM `project.dataset.user2_note_timeline`
)
SELECT note_id, note_created_at, likes_count, text
FROM (
SELECT note_id, ARRAY_AGG(STRUCT(note_created_at, likes_count, created_at) ORDER BY created_at DESC LIMIT 1)[OFFSET(0)].*
FROM `project.dataset.user_note_timeline`
GROUP BY note_id
ORDER BY likes_count DESC, note_created_at
LIMIT 2
) t
JOIN `project.dataset.user_notes` n
ON note_id = id
答案 1 :(得分:0)
SELECT TOP 1 t1.note_id, t1.note_created_at, t1.likes_count, t2.[text]
FROM 1_note_timeline t1 INNER JOIN 1_notes t2 ON t1.note_id = t2.Id
ORDER BY t1.created_at DESC
UNION
SELECT TOP 1 t1.note_id, t1.note_created_at, t1.likes_count, t2.[text]
FROM 2_note_timeline t1 INNER JOIN 2_notes t2 ON t1.note_id = t2.Id
ORDER BY t1.created_at DESC
最好为表引入索引,以提高性能。