我有下面的表来建模一个图书数据库:
CREATE TABLE Country (
ISO_3166 CHAR(2) PRIMARY KEY,
CountryName VARCHAR(256),
CID varchar(16)
);
CREATE TABLE Users (
UID INT PRIMARY KEY,
Username VARCHAR(256),
DoB DATE,
Age INT,
ISO_3166 CHAR(2) REFERENCES Country (ISO_3166)
);
CREATE TABLE Book (
ISBN VARCHAR(17) PRIMARY KEY,
Title VARCHAR(256),
Published DATE,
Pages INT,
Language VARCHAR(256)
);
CREATE TABLE Rating (
UID INT REFERENCES Users (UID),
ISBN VARCHAR(17) REFERENCES Book (ISBN),
PRIMARY KEY (UID,ISBN),
Rating int
);
我现在想找到那些在每个国家/地区拥有最多评级的用户。我可以使用这个查询:
SELECT Country.CountryName as CountryName, Users.Username as Username, COUNT(Rating.Rating) as NumRatings
FROM Country
JOIN Users ON Users.ISO_3166 = Country.ISO_3166
JOIN Rating ON Users.UID = Rating.UID
GROUP BY Country.CID, CountryName, Username
ORDER BY CountryName ASC
要以以下格式返回每个用户的评分数,请执行以下操作:
Countryname | Username | Number of Ratings of this user
我还管理了以下查询,它为每个国家提供了一个用户,但它不是评分最多的一个:
SELECT DISTINCT ON (CountryName)
CountryName, Username, MAX(NumRatings)
FROM (
SELECT Country.CountryName as CountryName, Users.Username as Username, COUNT(Rating.Rating) as NumRatings
FROM Country
JOIN Users ON Users.ISO_3166 = Country.ISO_3166
JOIN Rating ON Users.UID = Rating.UID
GROUP BY Country.CID, CountryName, Username
ORDER BY CountryName ASC) AS MyTable
GROUP BY CountryName, Username, NumRatings
ORDER BY CountryName ASC;
但是如何编写一个查询来挑选每个国家最多的用户呢?
2条答案
按热度按时间qzlgjiam1#
你是如此接近:
Postgres允许您排序,以确定当您正在区分的列由多个行表示时包含哪条记录。在这种情况下,按NumRatings降序排序应该为您提供每个国家/地区NumRatings值最高的行中的值。
20jt8wwn2#
DISTINCT ON
很好,很容易获得一个(如单词“distinct”所暗示的)用户,每个国家的评分最高。参见:但是你想...
找到每个国家的评分最高的用户。
一个以上的国家可以有最多的收视率。
我想首先聚合评级,然后连接到users表-在CTE中。然后使用
WITH TIES
在LATERAL
子查询中为每个国家选择一个或多个获胜者:关于“先聚合,后加入”:
关于
WITH TIES
:关于
LATERAL
:值得注意的是,你不想
GROUP BY Country.CID
。country.ISO_3166
是PK,使用它代替。(我优化了查询,所以我根本不需要GROUP BY
中的国家。