Select 使用 Postgres 8.3 或更低版本的另一个字段中的最大值和对应值
Select maximum value and corresponding value in another field using Postgres 8.3 or lower
所以我必须执行上述操作并且我使用的是 Postgres 8.3,所以我不能使用 window 函数。
我无法使用LIMIT功能(这是一道作业题)
我有这样的查询(我省略了 desc 条件):
SELECT MAX(count)
FROM
(
SELECT id, count(*) as count FROM memberlist
WHERE desc = ...some conditions...
GROUP BY id
) AS STT
成员列表包含每个成员都有描述和工作。
成员可以有多个工作。所以上面的查询对每个成员进行计数以查看他们有多少工作(因为每个成员都有自己的 ID)。
现在,我的问题是上面的查询可以很好地获取 1 人拥有的最大工作数量,但是一旦我尝试获取该 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
)
我认为这个解决方案不是很好而且效率低下,所以我希望改进它或使用其他方法。
我认为使用 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
)
您可以修改内部查询以加入 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
)
所以我必须执行上述操作并且我使用的是 Postgres 8.3,所以我不能使用 window 函数。 我无法使用LIMIT功能(这是一道作业题)
我有这样的查询(我省略了 desc 条件):
SELECT MAX(count)
FROM
(
SELECT id, count(*) as count FROM memberlist
WHERE desc = ...some conditions...
GROUP BY id
) AS STT
成员列表包含每个成员都有描述和工作。 成员可以有多个工作。所以上面的查询对每个成员进行计数以查看他们有多少工作(因为每个成员都有自己的 ID)。
现在,我的问题是上面的查询可以很好地获取 1 人拥有的最大工作数量,但是一旦我尝试获取该 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
)
我认为这个解决方案不是很好而且效率低下,所以我希望改进它或使用其他方法。
我认为使用 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
)
您可以修改内部查询以加入 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
)