【发布时间】:2016-07-26 19:14:36
【问题描述】:
在 PostgreSQL 9.5.3 数据库中,我有一个 credit_card_balances 表,它引用了一个 persons 表,该表跟踪与特定人关联的各种信用卡的余额:
CREATE TABLE persons (
id serial PRIMARY KEY,
name text
);
CREATE credit_card_balances (
id serial PRIMARY KEY,
card_provider text,
person int REFERENCES persons,
balance decimal,
timestamp timestamp
);
credit_card_balances 的示例行:
id | card_provider | person | balance | timestamp
123 | visa | 1234 | 1.00 | 16-07-26 17:00
我需要检索同时拥有“visa”和“amex”卡的人的集合,以便“visa”卡上的最近余额大于最近余额在“美国运通”卡上。
对于每个(person, card_provider),表中最多可能有大约 100 行。理想情况下,输出列是:
person, provider1_balance, provider2_balance, provider1_timestamp, provider2_timestamp
我知道我可以做类似的事情
SELECT DISTINCT ON (card_provider) *
FROM credit_card_balances
WHERE person=1234
ORDER BY card_provider, timestamp DESC;
获取特定人员每张卡的最新余额。但我不确定如何对所有人执行此操作并验证上述条件,或者这是否是正确的方法。
编辑:作为答案中的部分建议,我也可以做类似的事情
SELECT * from credit_card_balances b1, credit_card_balances b2
WHERE b1.person = b2.person
AND (b1.card_provider = 'amex'
AND b1.timestamp in
(SELECT MAX(time_stamp)
FROM credit_card_balances
WHERE card_provider = 'amex'))
AND (b2.card_provider = 'visa'
AND <... same as above>)
AND b1.balance > b2.balance;
但我注意到这会导致糟糕的表现。所以我认为这不是一个好的选择。
【问题讨论】:
-
缺少通常的嫌疑人:表定义(显示数据类型和约束)和 Postgres 版本。最佳答案取决于这些,以及基数和值频率。平均每个
(person, card_provider)大约有多少行?结果中所需的列也会膨胀。最后的第一件事:在同一个数据库中是否有一个包含不同人员的表?通常,你有一个类似person的表。 -
@ErwinBrandstetter 感谢 cmets 的帮助 - 我现在已将所有这些信息添加到帖子中!
-
好多了!
timestamp未定义NOT NULL?
标签: sql postgresql greatest-n-per-group relational-division