显示前n行按一列排序,但它们应在另一列中唯一(SQLite,Android Room)

时间:2019-08-28 06:55:02

标签: sqlite android-room

从mytable中选择一个简单的*将返回下面的行。我不知道如何在后期绘制表格,所以我要添加图片 select * from my_table

我在问题标题中提到: (i)显示按一列排序的前n行(可以使用order by实现) (ii),但它们应该在另一列中是唯一的(由collectionID列唯一)

从mytable中选择* 按lastAccessTime DESC排序;

这将根据表的lastAccessTime降序对表进行排序,如下图所示: enter image description here

现在,我想根据它们的collectionID过滤这些行。因此,每个collectionID仅1行。我已添加图像。删除线行应被删除。 enter image description here

另外,应该返回前n行(比如说30行)。

我正在使用使用SQLite的Android Room ORM,但要获得所需的结果集,我必须编写正确的查询。

2 个答案:

答案 0 :(得分:0)

我认为您这里需要一个窗口函数过滤器。它将根据collectionID分配一个行号,然后您只能为每个collectionID获取1行。您可以尝试-

 SELECT *
 FROM (SELECT *, ROW_NUMBER() OVER(PARTITION BY collectionID ORDER BY ID DESC) RN
       FROM mytable) T
 WHERE RN = 1
 LIMIT 30;

答案 1 :(得分:0)

关键思想是使用一个查询“过滤”数据,该查询是另一个查询的源。可以在其他答案中使用窗口函数,但是基本的子查询也已足够:

SELECT *
FROM mytable 
   INNER JOIN 
   (SELECT Max(id) AS singleID, collectionID
    FROM mytable
    GROUP BY collectionID) AS filter
   ON mytable.id = filter.singleID
ORDER BY lastAccessTime DESC
LIMIT 30;