我有一个源表,其中包含每个月的员工帐户详细信息,日期是字符串类型(yyyyMMdd)。尝试查找每个帐户的当月值和上月值之和。
Source data:
+-----------+-------------+-----------+----------+
| date | account | division | amount |
+-----------+-------------+-----------+----------+
| 20190331 | 123 | AB0 | 100 |
+-----------+-------------+-----------+----------+
| 20190331 | 123 | AB1 | 110 |
+-----------+-------------+-----------+----------+
| 20190331 | 123 | AB2 | 120 |
+-----------+-------------+-----------+----------+
| 20190228 | 123 | AB4 | 100 |
+-----------+-------------+-----------+----------+
| 20190228 | 123 | AB1 | 100 |
+-----------+-------------+-----------+----------+
| 20190228 | 123 | AB2 | 100 |
+-----------+-------------+-----------+----------+
| 20190131 | 123 | AB0 | 100 |
+-----------+-------------+-----------+----------+
在黑斑羚的查询下面,但对于当前和上个月,我返回的结果相同。
select distinct * from (
SELECT
sum(amount) over (partition BY account, a.date) AS asset_current,
sum(amount) over (partition BY account, from_unixtime(unix_timestamp(to_date(LAST_DAY(ADD_MONTHS(to_timestamp(data_as_of_date,'yyyyMMdd'),-1))),'yyyy-MM-dd'),'yyyyMMdd')) AS asset_previous,
account,
date,
FROM employee_assets a
)x ;
预期输出:
+-----------+-------------+--------------------+----------------------+
| date | account | current_month_sum | previous_month_sum |
+-----------+-------------+--------------------+----------------------+
| 20190331 | 123 | 330 | 300 |
+-----------+-------------+--------------------+----------------------+
| 20190228 | 123 | 300 | 100 |
+-----------+-------------+--------------------+----------------------+
| 20190131 | 123 | 100 | 0 |
+-----------+-------------+--------------------+----------------------+
我使用了以下查询,但是如果上个月的数据不可用,它将返回前一个月的asset_previous。
SELECT
x.*,
LAG(current_month_sum, 1, 0) OVER(PARTITION BY account ORDER BY adate) previous_month_sum
FROM (
SELECT adate, account, SUM(amount) current_month_sum
FROM employee_assets
GROUP BY adate, account
) x
ORDER BY adate DESC
例如:我们没有帐户123的20181231输入数据,因此月份1的asset_prev应该为0,但查询返回500(这是2018年11月的金额) 输入数据:
+-----------+-------------+-----------+----------+
| date | account | division | amount |
+-----------+-------------+-----------+----------+
| 20190331 | 123 | AB0 | 100 |
+-----------+-------------+-----------+----------+
| 20190331 | 123 | AB1 | 110 |
+-----------+-------------+-----------+----------+
| 20190331 | 123 | AB2 | 120 |
+-----------+-------------+-----------+----------+
| 20190228 | 123 | AB4 | 100 |
+-----------+-------------+-----------+----------+
| 20190228 | 123 | AB1 | 100 |
+-----------+-------------+-----------+----------+
| 20190228 | 123 | AB2 | 100 |
+-----------+-------------+-----------+----------+
| 20190131 | 123 | AB0 | 100 |
+-----------+-------------+-----------+----------+
| 20181130 | 123 | ABX | 500 |
+-----------+-------------+-----------+----------+
查询返回:
+-----------+-------------+--------------------+----------------------+
| date | account | current_month_sum | previous_month_sum |
+-----------+-------------+--------------------+----------------------+
| 20190331 | 123 | 330 | 300 |
+-----------+-------------+--------------------+----------------------+
| 20190228 | 123 | 300 | 100 |
+-----------+-------------+--------------------+----------------------+
| 20190131 | 123 | 100 | 500 |
+-----------+-------------+--------------------+----------------------+
| 20191131 | 123 | 500 | 0 |
+-----------+-------------+--------------------+----------------------+
预期输出:
+-----------+-------------+--------------------+----------------------+
| date | account | current_month_sum | previous_month_sum |
+-----------+-------------+--------------------+----------------------+
| 20190331 | 123 | 330 | 300 |
+-----------+-------------+--------------------+----------------------+
| 20190228 | 123 | 300 | 100 |
+-----------+-------------+--------------------+----------------------+
| 20190131 | 123 | 100 | 0 |
+-----------+-------------+--------------------+----------------------+
| 20191131 | 123 | 500 | 0 |
+-----------+-------------+--------------------+----------------------+
答案 0 :(得分:3)
您可以在内部查询中使用聚合,并在外部查询中使用LAG()
以在account
分区中获取上个月的值。 LAG()
的三个参数形式使您可以指定默认值。
SELECT
x.*,
LAG(current_month_sum, 1, 0) OVER(PARTITION BY account ORDER BY adate) previous_month_sum
FROM (
SELECT adate, account, SUM(amount) current_month_sum
FROM employee_assets
GROUP BY adate, account
) x
ORDER BY adate DESC
注意:date
对于列名不是一个好的选择,因为它可能与保留字冲突。我在查询中将该列重命名为adate
。