使用Postgres 8.3或更低版本在另一个字段中选择最大值和相应值

时间:2015-04-16 14:09:33

标签: sql postgresql max

所以我必须执行上述操作并使用Postgres 8.3,因此我无法使用窗口函数。 我不能使用LIMIT功能(这是一个家庭作业问题)。

我有这样的查询(我省略了desc条件):

SELECT MAX(count)
FROM 
(
  SELECT id, count(*) as count FROM memberlist
  WHERE desc = ...some conditions...
  GROUP BY id
) AS STT

会员列表包含每个人都有一个desc和一个工作的成员。 会员可以有多个工作。因此,上述查询会对每个成员进行计数,以查看他们拥有多少个作业(因为每个成员都有自己的ID)。

现在,我的问题是上面的查询只能获得1个人拥有的最大工作数,但是一旦我尝试获得该问题的相应名称,我就会遇到问题。

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行两列(姓名,数字工作)作为我的解决方案?

我确实做了另一个丑陋但有效的查询。 这是:

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
)

我认为这个解决方案并不是一个非常好的解决方案,因此我希望改进它或使用其他方法。

2 个答案:

答案 0 :(得分:1)

您可以修改内部查询以加入memberlist,以便检索所需的列。然后,您可以通过having count(*) = (subquery)

将查询限制为具有最大数量的查询
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
)

答案 1 :(得分:0)

我认为使用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
)