Sql 使用Postgres 8.3或更低版本在另一个字段中选择最大值和相应值
因此,我必须做上述工作,我使用的是Postgres 8.3,因此我不能使用窗口函数。 我不能使用极限函数(这是一个家庭作业问题) 我有这样一个查询(我省略了desc条件): Memberlist包含每个成员都有一个desc和一个job的成员。 成员可以有多个作业。因此,上面的查询对每个成员进行计数,以查看他们有多少个作业(因为每个成员都有自己的id) 现在,我的问题是,上面的查询可以很好地获取一个人的最大工作数量,但一旦我尝试获取该人的对应名称,我就会遇到问题Sql 使用Postgres 8.3或更低版本在另一个字段中选择最大值和相应值,sql,postgresql,max,Sql,Postgresql,Max,因此,我必须做上述工作,我使用的是Postgres 8.3,因此我不能使用窗口函数。 我不能使用极限函数(这是一个家庭作业问题) 我有这样一个查询(我省略了desc条件): Memberlist包含每个成员都有一个desc和一个job的成员。 成员可以有多个作业。因此,上面的查询对每个成员进行计数,以查看他们有多少个作业(因为每个成员都有自己的id) 现在,我的问题是,上面的查询可以很好地获取一个人的最大工作数量,但一旦我尝试获取该人的对应名称,我就会遇到问题 SELECT mi.name, M
SELECT mi.name, MAX(count)
FROM
(
SELECT id, count(*) as count FROM memberlist
WHERE desc = ...some conditions...
GROUP BY id
) STT JOIN memberinfo mi ON (stt.id = mi.id)
GROUP BY mi.name;
上面给出了每个人(我想)的名字,而不仅仅是那些工作最多的人(应该是3个成员,每个成员有25个工作)。我使用memberlist中的id,并将其与memberinfo合并,以在memberinfo中获得名称
那么,我如何才能得到每个拥有最多工作的人的名字,这样我就有3行两列(name,Num jobs)作为我的解决方案
我确实提出了另一个问题,这个问题很难看,但很有效。
这是:
SELECT mi.name, stt.count
FROM
(
SELECT id, count(*) as count FROM memberlist
WHERE desc = ...some conditions...
GROUP BY id
) stt
JOIN memberinfo mi ON (mi.id = stt.id)
WHERE stt.count =
(
SELECT MAX(count)
FROM
(
SELECT id, count(*) as count FROM memberlist
WHERE desc = ...some conditions...
GROUP BY id
) AS MAXSTT
)
我认为这个解决方案不是一个很好的解决方案,效率很低,所以我希望改进它或使用另一种方法。我认为使用EXIST可能是一种改进。我认为您的查询应该是这样的:
SELECT mi.name, stt.count
FROM
(
SELECT id, count(*) as count FROM memberlist
WHERE desc = ...some conditions...
GROUP BY id
) stt
JOIN memberinfo mi ON (mi.id = stt.id)
WHERE exists
(
SELECT MAX(count)
FROM
(
SELECT id, count(*) as count FROM memberlist
WHERE desc = ...some conditions...
GROUP BY id
) AS MAXSTT
having MAX(MAXSTT.count)=stt.count
)
您可以修改内部查询以加入
成员列表
,以便检索所需的列。然后,您可以通过having count(*)=(子查询)
@不幸的是,我们有一个执行时间限制,这是我的问题。事实证明,这个解决方案是足够有效的。不过,有没有更好的办法,我还是想知道。
SELECT mi.name, stt.count
FROM
(
SELECT id, count(*) as count FROM memberlist
WHERE desc = ...some conditions...
GROUP BY id
) stt
JOIN memberinfo mi ON (mi.id = stt.id)
WHERE exists
(
SELECT MAX(count)
FROM
(
SELECT id, count(*) as count FROM memberlist
WHERE desc = ...some conditions...
GROUP BY id
) AS MAXSTT
having MAX(MAXSTT.count)=stt.count
)
SELECT m.id, mi.name, count(*) as count
FROM memberlist m
JOIN memberinfo mi ON m.id = mi.id
WHERE desc = ...some conditions...
GROUP BY m.id, mi.name
HAVING count(*) = (
SELECT MAX(count)
FROM (
SELECT id, count(*) as count
FROM memberlist
WHERE desc = ...some conditions...
GROUP BY id
) AS MAXSTT
)