【问题标题】:Count without 2nd subquery in SQLSQL 中没有第二个子查询的计数
【发布时间】:2020-12-31 06:14:22
【问题描述】:

我正在尝试获取在多天内至少订购 1 件产品的用户数。

交易表

usr_id|transt_id|product_id|spend| transaction_date

4       8           32      40      2020-05-08 17:54:59
4       7           31      20      2020-05-01 17:54:59
4       7           31      40      2020-05-01 17:54:59
4       6           20      30      2020-05-02 17:54:59
4       6           19      20      2020-05-02 17:54:59
4       6           18      10      2020-05-02 17:54:59
3       5           17      20      2020-05-04 17:54:59
3       5           16      10      2020-05-04 17:54:59
2       3           14      30      2020-05-04 18:54:59
2       3           13      50      2020-05-04 18:54:59
1       2           12      30      2020-05-05 20:54:59
1       2           12      40      2020-05-05 20:54:59
1       2           12      40      2020-05-04 20:54:59
1       1           11      20      2020-05-05 21:54:59
1       1           10      40      2020-05-05 21:54:59
3       4           10      60      2020-05-06 17:54:59

通过我的代码,我已经能够达到输出的点:

select user_id, count(*)
from (
select user_id, date(transaction_date)
from transactions
group by user_id, date(transaction_date)) as abc
group by user_id
having count(user_id)>1;

user_id | count
1           2
3           2
4           3

我想编写一个代码而不编写另一个子查询来获取具有 count(*)>1 的用户数; 输出应为:3.
换句话说,我不想要下面的代码;我想少写一个子查询或一个全新的查询

select count(*)
from (
select user_id, count(*)
from (
select user_id, date(transaction_date)
from transactions
group by user_id, date(transaction_date)) as abc
group by user_id
having count(user_id)>1) as bcd;

【问题讨论】:

    标签: mysql sql date count subquery


    【解决方案1】:

    您已经拥有的查询可以在没有子查询的情况下编写:

    select user_id, count(distinct date(transaction_date)) count
    from transactions
    group by user_id
    having count(distinct date(transaction_date))>1;
    

    因此,您现在需要的内容只需 1 个子查询即可编写:

    select count(*) count
    from (
      select user_id
      from transactions
      group by user_id
      having count(distinct date(transaction_date))>1
    ) t
    

    你可以用EXISTS得到同样的结果:

    select count(distinct t.user_id) count
    from transactions t
    where exists (
      select 1 
      from transactions
      where user_id = t.user_id and date(transaction_date) <> date(t.transaction_date)
    )
    

    请参阅demo

    【讨论】:

    • 关于产品的问题?
    • @P.Salmon 据我所知是关于日期的。
    猜你喜欢
    • 1970-01-01
    • 2018-05-16
    • 1970-01-01
    • 2017-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-01
    相关资源
    最近更新 更多