1

当按多个属性分组时,我试图找到前 n 条记录。我相信它与这个问题有关,但我很难根据我的情况调整所描述的解决方案。

为简化起见,我有一个包含列的表(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 解释都将不胜感激。

4

2 回答 2

3

与此问题类似,定义一个计算所需组的所有设备计数的 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
于 2017-12-04T11:50:34.137 回答
-1

我使用 sql server 测试了查询

select top 2 did, dateVal
from (select *, count(*) as c
      from test
      group by did,dateVal) as t
order by t.c desc 
于 2017-12-04T12:03:35.150 回答