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
您可能想要fetch first row only或distinct 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。
您似乎想选择具有最小值的 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, id到SELECT id,如果你想查询没有出示门票ID,这会使得结果更难以理解,当然:-)
| 归档时间: |
|
| 查看次数: |
6734 次 |
| 最近记录: |