TotalCount 基于仍需要获取的列
Posted
技术标签:
【中文标题】TotalCount 基于仍需要获取的列【英文标题】:TotalCount based on column that still needs to be fetched 【发布时间】:2018-02-23 08:04:02 【问题描述】:鉴于下面提取的行,我还需要总计 id-token 对可能有一个 valueableField。 valuableField
中的值可能有重复
领域
id
- 表格列
token
- 表格列
valuableField
- 表格列
totalCountOfValuableFIeld
字段如何填写?
totalCountOfValuableField
- 不是表中的列,是每个 id-token 对的不同 `valueableField 的总数。
我尝试了这个查询,但它迫使我对行进行分组,但这不是我想要的。
select id, token, valuableField, count(distinct valuableField) from table_1
样本数据
当前表
╔════════╦═════════════╦═══════════════╗
║ id ║ token ║ valuableField ║
╠════════╬═════════════╬═══════════════╣
║ 88 ║ test ║ unique1 ║
║ 88 ║ test ║ duplicate1 ║
║ 88 ║ random1 ║ 1unique ║
║ 88 ║ test ║ duplicate1 ║
║ 76 ║ bar ║ 1unique ║
║ 76 ║ bar ║ 2unique ║
╚════════╩═════════════╩═══════════════╝
我想要什么
╔════════╦═════════════╦═══════════════╦════════════════════════════╗
║ id ║ token ║ valuableField ║ totalCountOfValuableField ║
╠════════╬═════════════╬═══════════════╬════════════════════════════╣
║ 88 ║ test ║ unique1 ║ 2 ║
║ 88 ║ test ║ duplicate1 ║ 2 ║
║ 88 ║ random1 ║ 1unique ║ 1 ║
║ 88 ║ test ║ duplicate1 ║ 2 ║
║ 76 ║ bar ║ 2unique ║ 2 ║
║ 76 ║ bar ║ 3unique ║ 2 ║
╚════════╩═════════════╩═══════════════╩════════════════════════════╝
【问题讨论】:
附注:当它不是表的 ID 时,您不应该调用列id
。 ID 应该唯一标识表中的记录。你的没有。
为什么unique1
的行计数为2
? unique1
值在您的示例数据中仅出现一次
88-test 对有两个唯一的valuableField
(唯一1 和重复1)
【参考方案1】:
不幸的是,Postgres 不(还)在 window function 中支持 distinct
。基于workaround for SQL Server,您可以执行以下操作:
select id,
token,
valuableField,
count(*) filter (where rn = 1) over (partition by id, token)
from (
select id, token, valuableField,
row_number() over (partition by id, token, valuableField) as rn
from table_1
) t
【讨论】:
【参考方案2】:从您的预期结果看来,您似乎希望根据 id
和 token
计算不同的 valuableField
。 你可以用COUNT DISTINCT OVER
:
select
id,
token,
valuableField,
count(distinct valuableField) over (partition by id, token) as total
from mytable;
更新: 如前所述,PostgreSQL 不支持窗口函数中的 DISTINCT。所以你必须改用子查询:
select
id,
token,
valuableField,
(
select count(distinct m2.valuableField)
from mytable m2
where m2.id = m1.id and m2.token = m1.token
) as total
from mytable m1;
然而,这不是“id-token 对怎么可能有一个有价值的字段”。如果您想要这样,您必须按 valuableField
进行分区并计算不同的 id
/token
对。
【讨论】:
不幸的是 Postgres 不允许在窗口函数中使用distinct
@a_horse_with_no_name:哦,真令人失望。我知道 SQL Server 没有,但那只是 SQL Server。但是PostgreSQL?他们通常都很好。
我同意,这令人失望。如果我没记错的话,Postgres 11 的窗口函数将会有一些增强 - 但我不知道这是否包括对 distinct
的支持
谢谢你们。我已经接受了这个,因为它比@horse 的答案排在第一位,但是因为你的答案对我有帮助,所以对你们两个投了赞成票。这个子查询方法是否有效。只是要补充一点,如果令牌可以为空,则应使用is not distinct from
。以上是关于TotalCount 基于仍需要获取的列的主要内容,如果未能解决你的问题,请参考以下文章