在 PostgreSQL 中计算合并到单个列的特定 'date' 的累计和
Calculating the cumulative sum with a specific 'date' merged to single column in PostgreSQL
我有一个数据库,其中包含每个用户支付的金额和日期。现在一些用户在同一天付款,我想在一个数据透视表 table 中每天只显示一次这些付款的累计总和,我正在使用 Amazon QuickSight 创建它。
我已经完成了以下操作,但它们每行提供一次累积值,而且我没有办法只根据日期而不是其他任何东西进行分区,以及支付的总和。
Calculating Cumulative Sum in PostgreSQL
Calculating Cumulative daily sum in PostgreSQL
PostgreSQL, renumber and cumulative sum at once
我的查询如下所示:
SELECT
s.id,
s.first_name,
s.last_name,
s.birth_date,
s.card,
p.datetime,
p.amount,
Sum(p.amount)OVER(partition BY p.datetime ORDER BY p.datetime ) AS "Daily Amount"
FROM payments AS p
LEFT JOIN users AS s
ON p.s_h_uuid = s.h_uuid
ORDER BY p.datetime DESC
我在这一行做 Sum() Over() 的地方:
Sum(pa.amount)OVER(partition BY p.datetime ORDER BY p.datetime ) AS "Daily Amount"
我的 Table 的数据为:
用户:
| id | first_name | last_name | birth_date | card |
| 2 | first_nam2 | last_nam2 | 1990-02-01 | M |
| 3 | first_nam3 | last_nam3 | 1987-07-23 | M |
| 1 | first_nam1 | last_nam1 | 1954-11-15 | A |
| 4 | first_nam4 | last_nam4 | 1968-05-07 | V |
付款:
| p_uuid | datetime | amount |
| 2 | 2021-05-01 | 100.00 |
| 3 | 2021-05-01 | 100.00 |
| 2 | 2021-05-02 | 100.00 |
| 1 | 2021-05-03 | 100.00 |
| 3 | 2021-05-03 | 100.00 |
| 4 | 2021-05-03 | 100.00 |
| 2 | 2021-05-05 | 100.00 |
| 1 | 2021-05-05 | 100.00 |
| 4 | 2021-05-06 | 100.00 |
我想要的输出是“每日金额”在特定日期只显示一次,如果有多行具有相同的日期,那么对于其他行,它应该是空白或显示类似“北美":
| p.datetime | id | first_name | last_name | birth_date | card | pa.amount | "Daily Amount" |
| 2021-05-01 | 2 | first_nam2 | last_nam2 | 1990-02-01 | M | 100.00 | 200.00 |
| 2021-05-01 | 3 | first_nam3 | last_nam3 | 1987-07-23 | M | 100.00 | |
| 2021-05-02 | 2 | first_nam2 | last_nam2 | 1990-02-01 | M | 100.00 | 100.00 |
| 2021-05-03 | 1 | first_nam1 | last_nam1 | 1954-11-15 | A | 100.00 | 300.00 |
| 2021-05-03 | 3 | first_nam3 | last_nam3 | 1987-07-23 | M | 100.00 | |
| 2021-05-03 | 4 | first_nam4 | last_nam4 | 1968-05-07 | V | 100.00 | |
| 2021-05-05 | 2 | first_nam2 | last_nam2 | 1990-02-01 | M | 100.00 | 200.00 |
| 2021-05-05 | 1 | first_nam1 | last_nam1 | 1954-11-15 | A | 100.00 | |
| 2021-05-06 | 4 | first_nam4 | last_nam4 | 1968-05-07 | V | 100.00 | 100.00 |
有没有什么方法可以从 SQL(PostgreSQL 特定查询)得到这个输出?
看起来你的 sum() over()
计算出了错误的数量,尝试
Sum(p.amount) OVER(partition BY s.id, p.datetime) AS "Daily Amount",
编辑
如果要格式化输出(每个日期仅累积一次),请使用 row_number()
检测组中的第一行。确保 over()
子句与查询的 ORDER BY
同步。
SELECT
id,
first_name,
last_name,
birth_date,
card,
datetime,
amount,
case when rn=1 then "Daily Amount" end "Daily Amount"
FROM (
SELECT
s.id,
s.first_name,
s.last_name,
s.birth_date,
s.card,
p.datetime,
p.amount,
Sum(p.amount) OVER(partition BY s.id, p.datetime) AS "Daily Amount",
row_number() OVER(partition BY s.id, p.datetime ORDER BY p.amount) AS rn
FROM payments AS p
LEFT JOIN users AS s ON p.s_h_uuid = s.h_uuid
) t
ORDER BY datetime DESC, id, amount
如果每个日期只需要一次值,则使用 row_number()
:
select (case when 1 = row_number() over (partition by p.date order by p.p_uuid)
then sum(p.amount) over (partition by p.date)
end) as day_payments
我有一个数据库,其中包含每个用户支付的金额和日期。现在一些用户在同一天付款,我想在一个数据透视表 table 中每天只显示一次这些付款的累计总和,我正在使用 Amazon QuickSight 创建它。
我已经完成了以下操作,但它们每行提供一次累积值,而且我没有办法只根据日期而不是其他任何东西进行分区,以及支付的总和。
Calculating Cumulative Sum in PostgreSQL
Calculating Cumulative daily sum in PostgreSQL
PostgreSQL, renumber and cumulative sum at once
我的查询如下所示:
SELECT
s.id,
s.first_name,
s.last_name,
s.birth_date,
s.card,
p.datetime,
p.amount,
Sum(p.amount)OVER(partition BY p.datetime ORDER BY p.datetime ) AS "Daily Amount"
FROM payments AS p
LEFT JOIN users AS s
ON p.s_h_uuid = s.h_uuid
ORDER BY p.datetime DESC
我在这一行做 Sum() Over() 的地方:
Sum(pa.amount)OVER(partition BY p.datetime ORDER BY p.datetime ) AS "Daily Amount"
我的 Table 的数据为:
用户:
| id | first_name | last_name | birth_date | card |
| 2 | first_nam2 | last_nam2 | 1990-02-01 | M |
| 3 | first_nam3 | last_nam3 | 1987-07-23 | M |
| 1 | first_nam1 | last_nam1 | 1954-11-15 | A |
| 4 | first_nam4 | last_nam4 | 1968-05-07 | V |
付款:
| p_uuid | datetime | amount |
| 2 | 2021-05-01 | 100.00 |
| 3 | 2021-05-01 | 100.00 |
| 2 | 2021-05-02 | 100.00 |
| 1 | 2021-05-03 | 100.00 |
| 3 | 2021-05-03 | 100.00 |
| 4 | 2021-05-03 | 100.00 |
| 2 | 2021-05-05 | 100.00 |
| 1 | 2021-05-05 | 100.00 |
| 4 | 2021-05-06 | 100.00 |
我想要的输出是“每日金额”在特定日期只显示一次,如果有多行具有相同的日期,那么对于其他行,它应该是空白或显示类似“北美":
| p.datetime | id | first_name | last_name | birth_date | card | pa.amount | "Daily Amount" |
| 2021-05-01 | 2 | first_nam2 | last_nam2 | 1990-02-01 | M | 100.00 | 200.00 |
| 2021-05-01 | 3 | first_nam3 | last_nam3 | 1987-07-23 | M | 100.00 | |
| 2021-05-02 | 2 | first_nam2 | last_nam2 | 1990-02-01 | M | 100.00 | 100.00 |
| 2021-05-03 | 1 | first_nam1 | last_nam1 | 1954-11-15 | A | 100.00 | 300.00 |
| 2021-05-03 | 3 | first_nam3 | last_nam3 | 1987-07-23 | M | 100.00 | |
| 2021-05-03 | 4 | first_nam4 | last_nam4 | 1968-05-07 | V | 100.00 | |
| 2021-05-05 | 2 | first_nam2 | last_nam2 | 1990-02-01 | M | 100.00 | 200.00 |
| 2021-05-05 | 1 | first_nam1 | last_nam1 | 1954-11-15 | A | 100.00 | |
| 2021-05-06 | 4 | first_nam4 | last_nam4 | 1968-05-07 | V | 100.00 | 100.00 |
有没有什么方法可以从 SQL(PostgreSQL 特定查询)得到这个输出?
看起来你的 sum() over()
计算出了错误的数量,尝试
Sum(p.amount) OVER(partition BY s.id, p.datetime) AS "Daily Amount",
编辑
如果要格式化输出(每个日期仅累积一次),请使用 row_number()
检测组中的第一行。确保 over()
子句与查询的 ORDER BY
同步。
SELECT
id,
first_name,
last_name,
birth_date,
card,
datetime,
amount,
case when rn=1 then "Daily Amount" end "Daily Amount"
FROM (
SELECT
s.id,
s.first_name,
s.last_name,
s.birth_date,
s.card,
p.datetime,
p.amount,
Sum(p.amount) OVER(partition BY s.id, p.datetime) AS "Daily Amount",
row_number() OVER(partition BY s.id, p.datetime ORDER BY p.amount) AS rn
FROM payments AS p
LEFT JOIN users AS s ON p.s_h_uuid = s.h_uuid
) t
ORDER BY datetime DESC, id, amount
如果每个日期只需要一次值,则使用 row_number()
:
select (case when 1 = row_number() over (partition by p.date order by p.p_uuid)
then sum(p.amount) over (partition by p.date)
end) as day_payments