Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/83.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 使用Postgres 8.3或更低版本在另一个字段中选择最大值和相应值_Sql_Postgresql_Max - Fatal编程技术网

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

Sql 使用Postgres 8.3或更低版本在另一个字段中选择最大值和相应值,sql,postgresql,max,Sql,Postgresql,Max,因此,我必须做上述工作,我使用的是Postgres 8.3,因此我不能使用窗口函数。 我不能使用极限函数(这是一个家庭作业问题) 我有这样一个查询(我省略了desc条件): Memberlist包含每个成员都有一个desc和一个job的成员。 成员可以有多个作业。因此,上面的查询对每个成员进行计数,以查看他们有多少个作业(因为每个成员都有自己的id) 现在,我的问题是,上面的查询可以很好地获取一个人的最大工作数量,但一旦我尝试获取该人的对应名称,我就会遇到问题 SELECT mi.name, M

因此,我必须做上述工作,我使用的是Postgres 8.3,因此我不能使用窗口函数。 我不能使用极限函数(这是一个家庭作业问题)

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

Memberlist包含每个成员都有一个desc和一个job的成员。 成员可以有多个作业。因此,上面的查询对每个成员进行计数,以查看他们有多少个作业(因为每个成员都有自己的id)

现在,我的问题是,上面的查询可以很好地获取一个人的最大工作数量,但一旦我尝试获取该人的对应名称,我就会遇到问题

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
)