【问题标题】:How to group by an attribute and order by date如何按属性分组并按日期排序
【发布时间】:2016-08-05 11:36:01
【问题描述】:

我有两张桌子:

医生

CREATE TABLE "medic" (
   "id" BIGINT NOT NULL, 
   "name" CHARACTER VARYING(255) NOT NULL,
   PRIMARY KEY ("id")

);

评论

CREATE TABLE IF NOT EXISTS "comment" (
   "id" BIGINT NOT NULL,
   "medic_id" BIGINT NOT NULL,
   "comment" CHARACTER VARYING(1024) NOT NULL,
   "created_at" TIMESTAMP WITHOUT TIME ZONE NOT NULL DEFAULT now(),
   CONSTRAINT pk_comment PRIMARY KEY (id),
   CONSTRAINT fk_comment_medic FOREIGN KEY (medic_id)
   REFERENCES medic(id) ON UPDATE NO ACTION ON DELETE NO ACTION
);

现在我想得到medic_id, name, comments_count 和所有ordered by created_at

这是我迄今为止尝试过的:

SELECT m.id, m.name, COUNT(c.id)
FROM COMMENT AS c
JOIN medic AS m ON m.id = c.medic_id
GROUP BY m.id, m.name, c.created_at
ORDER BY c.created_at DESC

但显然这是行不通的,因为按日期分组是没有意义的,尽管当我想按日期排序时必须这样做。

另一种方法是使用窗口函数。特别是rank() over (partition by m.id order by c.created_at desc)。但在这种情况下,我失去了所有记录的排序。

这里有一些SQLFiddle

我正在使用 Postgres 9.3

【问题讨论】:

  • 通过示例性的期望输出,问题会更清楚。

标签: postgresql group-by sql-order-by


【解决方案1】:

我猜你想在最近的评论日期之前订购:

SELECT m.id, m.name, COUNT(c.id)
FROM COMMENT c JOIN
     medic m
     ON m.id = c.medic_id
GROUP BY m.id, m.name
ORDER BY MAX(c.created_at) DESC;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-02-19
    • 2020-08-01
    • 2021-09-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-27
    • 1970-01-01
    相关资源
    最近更新 更多