如何选择N个具有唯一列值的最新行

时间:2018-07-31 22:30:06

标签: sql postgresql

我需要执行查询以从表中检索N个(在本例中为4个)最近的行,这些行在特定列上均具有不同的值。

该表是一个印象表,我需要从该表中检索用户访问过的4个唯一的最近页面,并由page_id colun标识。我的主要问题是在用户连续访问同一页面的情况下出现的,因此,如果我执行的是天真

SELECT page_id 
FROM impressions 
WHERE user_id = #### 
ORDER BY created_at DESC
LIMIT 4;

我最终得到了重复的值。

我在这里偶然发现了一个答案,我似乎再也找不到了,它建议使用我尝试过的窗口函数

SELECT page_id, DENSE_RANK() OVER(ORDER BY page_id) as rnk
FROM impressions
WHERE user_id = ####
ORDER BY created_at DESC;

哪个或多或少会产生我想要的东西,得到以下结果:

   page_id | rnk 
-----------+-----
       325 |  10
       325 |  10
       524 |  20
       235 |   5
       235 |   5
       524 |  20
       524 |  20
       524 |  20
       524 |  20
       524 |  20
       524 |  20
       524 |  20
       524 |  20
       524 |  20
       524 |  20
       524 |  20
       524 |  20
       524 |  20
       499 |  13
       499 |  13

问题是如何从这里开始,也许以该查询为起点,我最终会得到类似

的信息
   page_id | rnk 
-----------+-----
       325 |  10
       524 |  20
       235 |   5
       499 |  13

1 个答案:

答案 0 :(得分:0)

您可以使用group by

SELECT page_id 
FROM impressions 
WHERE user_id = #### 
GROUP BY page_id
ORDER BY MAX(created_at) DESC
LIMIT 4;