【问题标题】:Join two subqueries and have a field: division of the results of two subqueries加入两个子查询,有一个字段:两个子查询结果的除法
【发布时间】:2016-11-07 21:46:31
【问题描述】:

我有一张这样的桌子:

 userid | trackid | path
  123      70000     ad
  123      NULL     abc.com
  123      NULL     Apply
  345      70001    Apply
  345      70001    Apply
  345      NULL     Direct
  345      NULL     abc.com
  345      NULL     cdf.com

我想要这样的查询。当path='abc.com'时,num_website +1;当 path='Apply', num_apply +1

  userid | num_website | num_Apply | num_website/num_Apply
   123         1            1             1
   345         1            2            0.5

我的语法是这样的:

select * from 
(select userid,count(path) as is_CWS
from TABLE
where path='abc.com'
group by userid
having count(path)>1) a1
JOIN
(select userid,count(userid) as Apply_num from         
where trackid is not NULL
group by userid) a2 
on a1.userid=a2.userid

我的问题是 1. 根据我上面的语法,如何拥有字段 num_website/num_apply? 2.有没有其他更简单的方法可以得到我想要的结果?

分享的任何景点都会感激不尽。

【问题讨论】:

  • 什么是列别名“is_CWS”?还是 num_website ? where 子句“track_id is not null”是否适用于查询的顶部(别名为 a1)?看看我的查询有什么不同
  • 您没有主键。这可能会在适当的时候证明是有问题的

标签: mysql postgresql join subquery


【解决方案1】:

让您开始...您可以在此基础上构建:

select 
userid,
SUM(CASE WHEN path='abc.com'then 1 else 0 end ) as  num_website,
SUM(CASE WHEN path='Apply' and trackid is not NULL then 1 else 0 end ) as Apply_Num
from TABLE
WHERE path='abc.com' or path='Apply' -- may not need this ... play with it
group by userid

【讨论】:

  • 请解释拒绝投票的原因,以便我们解决问题......(无论是谁做的)谢谢。
【解决方案2】:

最简单的方法是更改​​选择行:

SELECT a1.userid, a1.is_CWS, a2.Apply_num, a1.is_CWS/a2.Apply_num FROM (select userid,count(path) as is_CWS from TABLE where path='abc.com' group by userid having count(path)>1) a1 JOIN (select userid,count(userid) as Apply_num from TABLE where trackid is not NULL group by userid) a2 on a1.userid=a2.userid

然后继续执行其余的查询。星星的意思是“选择一切”。如果您只想选择一些东西,您只需列出这些东西来代替星号,如果您想根据这些东西选择一些其他值,您也可以将它们放在星号中。在这种情况下,a1.is_CWS/a2.Apply_num 是一个表达式,MySql 知道如何根据 a1.is_CWS 和 a2.Apply_num 的值来计算它。

同样,您可以在单个表达式而不是子查询中执行很多这些子查询正在执行的操作。 objectNotFound 有正确的想法。您可以选择SUM(path="abc.com") as Apply_num,而不是执行子查询来检索具有特定属性的行数,并且您不必再加入。做出这样的改变给了我们:

SELECT a1.userid, SUM(path="abc.com") as is_CWS, a2.Apply_num, is_CWS/a2.Apply_num FROM TABLE JOIN (select userid,count(userid) as Apply_num FROM TABLE where trackid is not NULL group by userid) a2 on a1.userid=a2.userid GROUP BY userid

请注意,我将 GROUP BY 移到了查询的末尾。另请注意,我现在仅引用 is_CWS 而不是引用 a1.is_CWS(它不再在 a1 子表中,因此我们可以引用它)

您可以对其他子查询执行相同的操作,然后他们可以共享GROUP BY 子句,您将不再需要加入。

【讨论】:

  • 您的解释对我来说很有意义,并且现在有效。对于您提到的第二种方式,它不适用于我的数据库。有重复的问题。我想我可能在 redshift 中使用 PostgreSql。还有一个问题,如果你也熟悉redshift中的Postgresql,你知道如何将除法显示为十进制格式吗?
猜你喜欢
  • 2019-11-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-12
  • 2011-06-09
  • 1970-01-01
相关资源
最近更新 更多