使用 MAX 计算子查询列中的 MAX 值
Using MAX to compute MAX value in a subquery column
我正在尝试做的事情:我有一个 table、"band_style" 模式(band_id、样式)。
一个 band_id 可能会出现多次,以不同的样式列出。
我想要 band_id 的所有行,NUM(其中 NUM 是一个乐队拥有的不同风格的数量)对于具有第二多样式的乐队 ID。
我在这个查询上花了几个小时 - 几乎没有任何效果。
这就是我的进展。 table (data) 成功计算了所有样式小于 band 样式最大值的 band。现在,我需要所有具有结果 table 的 Max NUM 的行。这将使我的乐队具有第二多的风格。
然而,这个最终结果似乎忽略了 MAX 函数,只按原样返回 table(数据)。有人可以提供一些 insight/working 方法吗?我有超过 20 次尝试此查询,这是最接近的。
在 Oracle 上使用 SQL*PLUS
WITH data AS (
SELECT band_id, COUNT(*) AS NUM FROM band_style GROUP BY band_id HAVING COUNT(*) <
(SELECT MAX(c) FROM
(SELECT COUNT(band_id) AS c
FROM band_style
GROUP BY band_id)))
SELECT data.band_id, data.NUM FROM data
INNER JOIN ( SELECT band_id m, MAX(NUM) n
FROM data GROUP BY band_id
) t
ON t.m = data.band_id
AND t.n = data.NUM;
我会使用窗口函数(在本例中为 RANK())- 这非常适合在集合中找到 'n' 排名的东西。
SELECT DISTINCT bs.band_id
FROM band_style bs
WHERE EXISTS (
SELECT NULL
FROM (
SELECT
bs2.band_id,
bs2.num,
RANK() OVER (ORDER BY bs2.num) AS numrank
FROM (
SELECT bs1.band_id, COUNT(*) as num
FROM band_style bs1
GROUP BY bs1.band_id ) bs2 ) bs3
WHERE bs.band_id = bs3.band_id
AND bs3.numrank = 2 )
类似这样...根据您 post 下的评论,您正在寻找 DENSE_RANK()
select band_id
from ( select band_id, dense_rank() over (order by count(style) desc) as drk
from band_style
group by band_id
)
where drk = 2;
我正在尝试做的事情:我有一个 table、"band_style" 模式(band_id、样式)。 一个 band_id 可能会出现多次,以不同的样式列出。 我想要 band_id 的所有行,NUM(其中 NUM 是一个乐队拥有的不同风格的数量)对于具有第二多样式的乐队 ID。
我在这个查询上花了几个小时 - 几乎没有任何效果。
这就是我的进展。 table (data) 成功计算了所有样式小于 band 样式最大值的 band。现在,我需要所有具有结果 table 的 Max NUM 的行。这将使我的乐队具有第二多的风格。
然而,这个最终结果似乎忽略了 MAX 函数,只按原样返回 table(数据)。有人可以提供一些 insight/working 方法吗?我有超过 20 次尝试此查询,这是最接近的。
在 Oracle 上使用 SQL*PLUS
WITH data AS (
SELECT band_id, COUNT(*) AS NUM FROM band_style GROUP BY band_id HAVING COUNT(*) <
(SELECT MAX(c) FROM
(SELECT COUNT(band_id) AS c
FROM band_style
GROUP BY band_id)))
SELECT data.band_id, data.NUM FROM data
INNER JOIN ( SELECT band_id m, MAX(NUM) n
FROM data GROUP BY band_id
) t
ON t.m = data.band_id
AND t.n = data.NUM;
我会使用窗口函数(在本例中为 RANK())- 这非常适合在集合中找到 'n' 排名的东西。
SELECT DISTINCT bs.band_id
FROM band_style bs
WHERE EXISTS (
SELECT NULL
FROM (
SELECT
bs2.band_id,
bs2.num,
RANK() OVER (ORDER BY bs2.num) AS numrank
FROM (
SELECT bs1.band_id, COUNT(*) as num
FROM band_style bs1
GROUP BY bs1.band_id ) bs2 ) bs3
WHERE bs.band_id = bs3.band_id
AND bs3.numrank = 2 )
类似这样...根据您 post 下的评论,您正在寻找 DENSE_RANK()
select band_id
from ( select band_id, dense_rank() over (order by count(style) desc) as drk
from band_style
group by band_id
)
where drk = 2;