【问题标题】:Count number of times a value appears in different columns计算一个值在不同列中出现的次数
【发布时间】:2015-11-19 12:37:19
【问题描述】:

我有一个交易表,其中包含买家和卖家字段。我想要一个查询,它为参与交易的每个人输出一行,其中一列表示该人已成为买方的次数,另一列表示该人已成为卖方的次数。

我目前正在实现我想要的结果:

SELECT u.user_id,
     (SELECT COUNT(*) FROM transactions AS b WHERE b.buyer = u.user_id),
     (SELECT COUNT(*) FROM transactions AS s WHERE s.seller = u.user_id)
FROM users AS u;

这很好用,但它让我觉得愚蠢和不必要的缓慢。当我开始想设置条件时——例如,如果我想计算一个人在 3 月 1 日到 3 月 31 日期间以低于 1 美元的价格购买或出售铅笔的次数——那么查询就变得更加愚蠢了。

我确信有更好的方法,但我花了一段时间搜索并没有想出太多。提前感谢您的帮助。

【问题讨论】:

    标签: sql performance postgresql sqlperformance


    【解决方案1】:

    您的查询非常合理,并且很可能是运行此查询的最快方式。您要确保在 transactions 上有两个索引:transactions(buyer) 和 transactions(seller)。

    另一种方法是在使用显式连接之前汇总数据:

    select u.*, b.numbuyer, s.numseller
    from users u left join
         (select buyer, count(*) as numbuyer
          from transactions
          group by buyer
         ) b
         on  b.buyer = u.user_id left join
         (select seller, count(*) as numseller
          from transactions
          group by seller
         ) s
         on s.buyer = u.user_id;
    

    但是,您的查询可能是表达和运行此逻辑的最佳方式。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多