【问题标题】:Lost trying to use DISTINCT and GROUP BY尝试使用 DISTINCT 和 GROUP BY 失败
【发布时间】:2014-05-19 14:36:52
【问题描述】:

我遇到了一些我认为很简单的事情......

我有一个简单的模型 Statistic,它存储了一个日期 (created_at)、一个 user_fingerprint 和一个 structure_id。由此,我想创建一个图表来显示每天的#visitors。

原来如此

@structure.statistics.order('DATE(created_at) ASC').group('DATE(created_at)').count 

哪个有效并返回我所期望的:

=> {Sat, 18 May 2014=>50, Mon, 19 May 2014=>90}

现在我想要同样的,但我想用同一对(created_atuser_fingerprint)挤压所有行。例如:

|     created_at       | user_fingerprint | structure_id |
|----------------------|------------------|--------------|
| Sat, 18 May 2014 2PM |    '124512341'   |     12       |
| Sat, 18 May 2014 4PM |    '124512341'   |     12       |
| Mon, 19 May 2014 6PM |    '124512341'   |     12       |

有了这些数据,我会:

=> {Sat, 18 May 2014=>1, Mon, 19 May 2014=>1}
# instead of
=> {Sat, 18 May 2014=>2, Mon, 19 May 2014=>1}

我可以用 Ruby 来做,但我想知道我是否可以直接用 SQL 和 Arel 来做。

关于您的答案的解决方案

这是我最后所做的:

@impressions = {}
# The following is to ensure I will have a key when there is no stat for a day.
(15.days.ago.to_date..Date.today).each { |date| @impressions[date] = 0 }

@structure.statistics.where( Statistic.arel_table[:created_at].gt(Date.today - 15.days) )
                     .order('DATE(created_at) ASC')
                     .group('DATE(created_at)')
                     .select('DATE(created_at) as created_at, COUNT(DISTINCT(user_fingerprint)) as user_count')
                     .each{ |stat| @impressions[stat.created_at] = stat.user_count }

虽然我需要做一点 Ruby,但这对我有好处。

【问题讨论】:

  • 为什么您希望在 5 月 18 日星期六只获得 1 个?该用户当天有 2 条记录。我没有看到足够的条件。你的问题中没有使用结构 ID,对吗?
  • 我想存储所有记录,但希望每天只检索一个具有“唯一身份访问者”的记录。不使用 structure_id,因为当我执行 @structure.statistics 时,它默认是作用域的
  • 啊哈!我将修改我的答案以包含唯一身份访问者。查找 count(distinct 列名)

标签: sql ruby-on-rails arel


【解决方案1】:

您的查询类似于(Oracle 方言)

select trunc(created_at), user_fingerprint, count(distinct user_fingerprint)
from statistic
group by trunc(created_at), user_fingerprint 

没有用于从日期时间数据字段中获取日期部分的 SQL 标准。

oracle:截断(dt_column) sql server: cast(dt_column As Date) mysql: DATE(dt_column)

【讨论】:

    【解决方案2】:
    @structure.statistics.order('DATE(created_at) ASC').group('DATE(created_at)').select('count(distinct(user_fingerprint)) as user_count').first.user_count
    

    【讨论】:

    • 最好解释一下为什么您的代码可以解决问题。见How to Answer
    猜你喜欢
    • 1970-01-01
    • 2021-03-19
    • 1970-01-01
    • 2023-04-11
    • 1970-01-01
    • 1970-01-01
    • 2014-01-12
    • 1970-01-01
    • 2020-10-30
    相关资源
    最近更新 更多