如何按属性分组并按日期排序
How to group by an attribute and order by date
我有两个表:
医护人员
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
但是显然这行不通,因为按日期分组是没有意义的,尽管我想按日期排序时必须这样做。
另一种方法是使用 window 函数。特别是rank() over (partition by m.id order by c.created_at desc)
。但在这种情况下,我失去了对所有记录的排序。
这是一些 SQLFiddle。
我正在使用 Postgres 9.3
我猜你想在最近的评论日期之前订购:
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;
我有两个表:
医护人员
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
但是显然这行不通,因为按日期分组是没有意义的,尽管我想按日期排序时必须这样做。
另一种方法是使用 window 函数。特别是rank() over (partition by m.id order by c.created_at desc)
。但在这种情况下,我失去了对所有记录的排序。
这是一些 SQLFiddle。
我正在使用 Postgres 9.3
我猜你想在最近的评论日期之前订购:
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;