如何在每个组中仅选择最小创建日期的 ID

mib*_*iti 4 sql postgresql greatest-n-per-group

想象下一张桌子

售票处

 ========================
| id | question          |
 ========================
| 1  | Can u help me :)? |
 ========================
Run Code Online (Sandbox Code Playgroud)

用户输入表

 ======================================================
| id | answer               | dateCreated  | ticket_id |
 ======================================================
| 2  | It's my plessure :)? | 2016-08-05   |     1     |     
=======================================================
| 3  | How can i help u ?   | 2016-08-06   |     1     |
 ======================================================
Run Code Online (Sandbox Code Playgroud)

那么我怎样才能为每个具有最小日期值的组获取行的 id

所以我预期的答案应该是这样的

 ====
| id |
 ====
| 2  |
 ====
Run Code Online (Sandbox Code Playgroud)

更新:

我在下一个查询中得到了解决方案

SELECT id FROM UserEntry WHERE datecreated IN (SELECT MIN(datecreated) FROM CCUserEntry GROUP BY ticket_id)

改进的答案

SELECT id FROM UserEntry WHERE (ticket_id, datecreated) IN (SELECT ticket_id, MIN(datecreated) FROM UserEntry GROUP BY ticket_id);

这也是一个很好的正确答案注意DISTINCT ON不是 SQL 标准的一部分。)

SELECT DISTINCT ON (ue.ticket_id) ue.id FROM UserEntry ue ORDER BY ue.ticket_id, ue.datecreated

Gor*_*off 6

您可能想要fetch first row onlydistinct on(如果您关心不止一张票):

SELECT DISTINCT ON (ue.ticket_id) ue.id 
FROM UserEntry ue
ORDER BY ue.ticket_id, ue.date_created
Run Code Online (Sandbox Code Playgroud)

这将获得id具有最小值的行date_created

  • @mibrahim.iti。. . 不,查询使用`DISTINCT ON`。这与“SELECT DISTINCT”非常非常不同。如果我打算写后者,我会写的。 (4认同)

Tho*_*ner 5

您似乎想选择具有最小值的 ID datecreated。这很简单:选择最小日期,然后选择与此日期匹配的 ID。

SELECT id FROM UserEntry WHERE datecreated = (SELECT MIN(datecreated) FROM UserEntry);
Run Code Online (Sandbox Code Playgroud)

如果您确定没有关系,或者无论如何您都可以只处理一行,那么FETCH FIRST ROW ONLY不幸的是,您也可以使用which 在 PostgreSQL 中没有 tie 子句。

SELECT id FROM UserEntry ORDER BY datecreated FETCH FIRST ROW ONLY;
Run Code Online (Sandbox Code Playgroud)

更新:您需要每张票的最短日期的条目 ID。每张票转换为GROUP BY ticket_idSQL。

SELECT ticket_id, id FROM UserEntry WHERE (ticket_id, datecreated) IN
  (SELECT ticket_id, MIN(datecreated) FROM UserEntry GROUP BY ticket_id);
Run Code Online (Sandbox Code Playgroud)

使用窗口函数也可以实现相同的效果,您只需读取一次表格:

SELECT ticket_id, id
FROM
(
  SELECT ticket_id, id, RANK() OVER (PARTITION BY ticket_id ORDER BY datecreated) AS rnk
  FROM UserEntry 
) ranked
WHERE rnk = 1;
Run Code Online (Sandbox Code Playgroud)

(更改SELECT ticket_id, idSELECT id,如果你想查询没有出示门票ID,这会使得结果更难以理解,当然:-)