使用 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;