我怎样才能 select 每个组中只有最小创建日期的 ID
How can i select only id of min created date in each group
想象下一张桌子
门票Table
========================
| id | question |
========================
| 1 | Can u help me :)? |
========================
UserEntry Table
======================================================
| id | answer | dateCreated | ticket_id |
======================================================
| 2 | It's my plessure :)? | 2016-08-05 | 1 |
=======================================================
| 3 | How can i help u ? | 2016-08-06 | 1 |
======================================================
那么我怎样才能只获得具有最小日期值的每个组的行 ID
所以我的预期答案应该是这样
====
| id |
====
| 2 |
====
更新:
我在下一个查询中得到了解决方案
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
您似乎想要select 最小datecreated
的ID。这很简单:select 最短日期,然后 select 匹配该日期的 ID。
SELECT id FROM UserEntry WHERE datecreated = (SELECT MIN(datecreated) FROM UserEntry);
如果你确定你不会有领带,或者如果你只用一行就没问题,你也可以使用 FETCH FIRST ROW ONLY
,它在 PostgreSQL 中没有领带子句不幸的是。
SELECT id FROM UserEntry ORDER BY datecreated FETCH FIRST ROW ONLY;
更新: 您需要每张票的最短日期的条目 ID。每张票在 SQL 中转换为 GROUP BY ticket_id
。
SELECT ticket_id, id FROM UserEntry WHERE (ticket_id, datecreated) IN
(SELECT ticket_id, MIN(datecreated) FROM UserEntry GROUP BY ticket_id);
使用 window 函数也可以实现同样的效果,您只需阅读 table 一次:
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;
(如果您希望查询不显示工单 ID,请将 SELECT ticket_id, id
更改为 SELECT id
,这当然会使结果更难理解:-)
您可能需要 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
这将在具有最小 date_created
值的行中获取 id
。
ANSI SQL 的解决方案适用于广泛支持 modern SQL 的 DBMS,是使用 window 函数:
select id
from (
select id, row_number() over (partition by ticket_id order by date_created) as rn
from userentry
) t
where rn = 1;
请注意,在 Postgres 中,戈登使用 distinct on ()
的解决方案通常比使用 window 函数
更快
想象下一张桌子
门票Table
========================
| id | question |
========================
| 1 | Can u help me :)? |
========================
UserEntry Table
======================================================
| id | answer | dateCreated | ticket_id |
======================================================
| 2 | It's my plessure :)? | 2016-08-05 | 1 |
=======================================================
| 3 | How can i help u ? | 2016-08-06 | 1 |
======================================================
那么我怎样才能只获得具有最小日期值的每个组的行 ID
所以我的预期答案应该是这样
====
| id |
====
| 2 |
====
更新:
我在下一个查询中得到了解决方案
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
您似乎想要select 最小datecreated
的ID。这很简单:select 最短日期,然后 select 匹配该日期的 ID。
SELECT id FROM UserEntry WHERE datecreated = (SELECT MIN(datecreated) FROM UserEntry);
如果你确定你不会有领带,或者如果你只用一行就没问题,你也可以使用 FETCH FIRST ROW ONLY
,它在 PostgreSQL 中没有领带子句不幸的是。
SELECT id FROM UserEntry ORDER BY datecreated FETCH FIRST ROW ONLY;
更新: 您需要每张票的最短日期的条目 ID。每张票在 SQL 中转换为 GROUP BY ticket_id
。
SELECT ticket_id, id FROM UserEntry WHERE (ticket_id, datecreated) IN
(SELECT ticket_id, MIN(datecreated) FROM UserEntry GROUP BY ticket_id);
使用 window 函数也可以实现同样的效果,您只需阅读 table 一次:
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;
(如果您希望查询不显示工单 ID,请将 SELECT ticket_id, id
更改为 SELECT id
,这当然会使结果更难理解:-)
您可能需要 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
这将在具有最小 date_created
值的行中获取 id
。
ANSI SQL 的解决方案适用于广泛支持 modern SQL 的 DBMS,是使用 window 函数:
select id
from (
select id, row_number() over (partition by ticket_id order by date_created) as rn
from userentry
) t
where rn = 1;
请注意,在 Postgres 中,戈登使用 distinct on ()
的解决方案通常比使用 window 函数