sqlite - SQL-选择按多个字段分组的前n个,按计数排序

标签 sqlite greatest-n-per-group limit-per-group

我正在尝试按多个属性分组时查找前n条记录。我相信它与this problem有关,但是我很难适应所描述的解决方案。

为了简化,我有一个带有列的表(did是device_id的缩写):

id int
did int
dateVal dateTime


我试图找到行数最多的每一天的前n个device_id。

例如(忽略id和dateTime的时间部分),

did dateVal
1   2017-01-01
1   2017-01-01
1   2017-01-01
2   2017-01-01
3   2017-01-01
3   2017-01-01

1   2017-01-02
1   2017-01-02
2   2017-01-02
2   2017-01-02
2   2017-01-02
3   2017-01-02


找到前2个会产生...

1, 2017-01-01
3, 2017-01-01
2, 2017-01-02
1, 2017-01-02


我目前的幼稚做法只为我提供了所有日期中的前2名。

--Using SQLite
select date(dateVal) || did 
from data 
group by date(dateVal), did
order by count(*) desc 
limit 2


我正在使用串联运算符,以便以后可以提取行。

我正在使用SQLite,但任何常规的SQL解释将不胜感激。

最佳答案

this question相似,定义一个CTE,该CTE计算所需组的所有设备计数,然后在WHERE ... IN子查询中使用它,该查询仅限于该日期的前2个设备:

WITH device_counts AS (
  SELECT did, date(dateval) AS dateval, COUNT(*) AS device_count
  FROM data
  GROUP BY did, date(dateval)
)
SELECT did, date(dateval) FROM device_counts DC_outer
WHERE did IN (
  SELECT did
  FROM device_counts DC_inner
  WHERE DC_inner.dateval = DC_outer.dateval
  GROUP BY did, date(dateval)
  ORDER BY DC_inner.device_count DESC LIMIT 2
)
ORDER BY date(dateval), did

关于sqlite - SQL-选择按多个字段分组的前n个,按计数排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47631679/

相关文章:

python - django sqlite 为别名 'default' 创建测试数据库

MySQL - 检索每个用户每天的最后更新

php - DQL 选择具有一列 MAX 值的每一行

php - MySQL:如何只选择每个不同的 x-column-name 中的三个

python - SQLite:仅返回每个组中的前 2 个结果

javascript - 如何使用ng-repeat angularjs ionic将sqlite中的数据显示到列表中

.net - 序列化数据库列仅返回文本字段的一部分

python - 用于多条 SQL 行的 f 字符串

SQL:如何选择组中同一行的两个字段?