sql - 在 Bigquery 中获取下一个值作为当前值
问题描述
我有这样的数据:
+-----+------------------+--------------------------+------------+
| Row | order_id | date_order | partner_id |
+-----+------------------+--------------------------+------------+
| 1 | SNB1905/0007786 | 2019-05-15 10:17:57 UTC | 70959 |
| 2 | SNB1905/0007786 | 2019-05-15 10:17:56 UTC | 70959 |
| 3 | SNB1904/0008810 | 2019-04-30 07:18:11 UTC | 70959 |
| 4 | SNB1902/0003122 | 2019-02-20 07:05:00 UTC | 70959 |
+-----+------------------+--------------------------+------------+
我想获得前一个order_id
并将其转换date_order
为我的时区。所以我做了这样的查询:
SELECT
order_id,
DATE(date_order,"Asia/Jakarta") AS date_only,
partner_id,
LAG(origin,1) OVER(PARTITION BY partner_id order by date_order) prev_order
FROM
`my_table`
WHERE
partner_id = 70959
ORDER BY
date_order DESC
我得到的结果是这样的:
+-----+------------------+-------------+------------+------------------+
| Row | order_id | date_only | partner_id | prev_order |
+-----+------------------+-------------+------------+------------------+
| 1 | SNB1905/0007786 | 2019-05-15 | 70959 | SNB1904/0008810 |
| 2 | SNB1905/0007786 | 2019-05-15 | 70959 | SNB1905/0007786 |
| 3 | SNB1904/0008810 | 2019-04-30 | 70959 | SNB1902/0003122 |
| 4 | SNB1902/0003122 | 2019-02-20 | 70959 | null |
+-----+----------------- +-------------+------------+------------------+
我想要的结果是这样的:
+-----+------------------+-------------+------------+------------------+
| Row | order_id | date_only | partner_id | prev_order |
+-----+------------------+-------------+------------+------------------+
| 1 | SNB1905/0007786 | 2019-05-15 | 70959 | SNB1904/0008810 |
| 2 | SNB1905/0007786 | 2019-05-15 | 70959 | SNB1904/0008810 |
| 3 | SNB1904/0008810 | 2019-04-30 | 70959 | SNB1902/0003122 |
| 4 | SNB1902/0003122 | 2019-02-20 | 70959 | null |
+-----+-----------------+--------------+------------+------------------+
如果order_id
等于prev_order
,我想获取prev_order
列中的前一个值。
解决方案
以下是 BigQuery 标准 SQL
#standardSQL
SELECT
order_id,
date_only,
partner_id,
( SELECT order_id FROM UNNEST(prev_orders) prev_order
WHERE t.order_id != order_id
ORDER BY date_order DESC LIMIT 1
) prev_order
FROM (
SELECT
order_id,
date_order,
DATE(date_order,"Asia/Jakarta") AS date_only,
partner_id,
ARRAY_AGG(STRUCT(order_id AS order_id, date_order AS date_order))
OVER(PARTITION BY partner_id ORDER BY date_order ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING) prev_orders
FROM `project.dataset.table`
) t
WHERE partner_id = 70959
-- ORDER BY date_order DESC
如果适用于您的问题的样本数据 - 结果是
Row order_id date_only partner_id prev_order
1 SNB1905/0007786 2019-05-15 70959 SNB1904/0008810
2 SNB1905/0007786 2019-05-15 70959 SNB1904/0008810
3 SNB1904/0008810 2019-04-30 70959 SNB1902/0003122
4 SNB1902/0003122 2019-02-20 70959 null
推荐阅读
- r - 对数据进行子集化时,如何将 geom_repel_text 与 geom_jitter 点对齐?
- google-apps-script - Google 表格中的单元格闪烁
- java - 如何在 JAVA swing 中调整文本工具提示的大小
- angular - 具有每行表格的角材料表
- arrays - BASH - 从具有相同菜单选项和描述的数组创建鞭尾菜单
- javascript - 特殊字符重音符号“~”在 Ã 或 Õ 上未显示在 Jquery 的表格中
- visual-studio - Ndepend 类耦合值排除所有不在我项目中的类
- python - 在 Windows 10 错误 Python 中安装 Jupyter Notebook
- r - 将 MULTILINESTRING 的特征集合组合成 R 中的一个封闭多边形
- python - Tkinter 错误(_tkinter.TclError:预期的整数,但得到“Serif”)