TotalCount 基于仍需要获取的列

Posted

技术标签:

【中文标题】TotalCount 基于仍需要获取的列【英文标题】:TotalCount based on column that still needs to be fetched 【发布时间】:2018-02-23 08:04:02 【问题描述】:

鉴于下面提取的行,我还需要总计 id-token 对可能有一个 valueableFieldvaluableField 中的值可能有重复

领域

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 的行计数为2unique1 值在您的示例数据中仅出现一次 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】:

从您的预期结果看来,您似乎希望根据 idtoken 计算不同的 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 基于仍需要获取的列的主要内容,如果未能解决你的问题,请参考以下文章

循环遍历列以获取基于标题的列号

分页总数计算,根据总记录数获取分页总数_目标科技

如何获取循环内数组值的位置信息

在单独的列中获取相同的表数据

当仅请求 COARSE_LOCATION 时,Android 是不是仍会使用 GPS 来获取位置?

如何获取以逗号分隔的列值