繁体   English   中英

SQL ORACLE Select 使用连接的前 N 行

[英]SQL ORACLE Select the top-N rows using join

使用 Kocury 关系与 Kocury 关系 的连接,根据消耗的老鼠总数找到占据前n 个位置的猫(消耗相同的猫占据相同的位置!)。

[此解决方案不太正常] 当n=1时,有两只猫(Tygrys 和 Lysy),但应该只有 Tygrys。

1

我有 3 个正确的解决方案,但对于我的 4 个,我没有使用 JOIN 运算符或 LEFT JOIN 或与 JOIN 相关的某事:

solution 1.
SELECT pseudo, przydzial_myszy + NVL(myszy_extra, 0) "ZJADA"
FROM Kocury K
WHERE (SELECT COUNT(DISTINCT przydzial_myszy + NVL(myszy_extra, 0)) FROM Kocury`enter code here`
      WHERE przydzial_myszy + NVL(myszy_extra, 0) > K.przydzial_myszy + NVL(K.myszy_extra, 0)) < 6
ORDER BY 2 DESC;

solution 2
SELECT pseudo, przydzial_myszy + NVL(myszy_extra, 0) "ZJADA"
FROM Kocury
WHERE przydzial_myszy + NVL(myszy_extra, 0) IN (
  SELECT *
  FROM (
    SELECT DISTINCT przydzial_myszy + NVL(myszy_extra, 0)
    FROM Kocury
    ORDER BY 1 DESC
  ) WHERE ROWNUM <= 6
);

solution 3
SELECT pseudo, ZJADA
FROM
(
  SELECT pseudo,
    NVL(przydzial_myszy, 0) + NVL(myszy_extra, 0) "ZJADA",
    DENSE_RANK() OVER (
      ORDER BY przydzial_myszy + NVL(myszy_extra, 0) DESC
    ) RANK
  FROM Kocury
)
WHERE RANK <= 6;

[科库里关系]

2

我不太了解列名,所以我会建议一个更容易理解的查询。 阅读代码中的注释。

with 
temp as
  (select cat_name,
     sum(mice_consumed) sum_mice
   from cats_mice
   group by cat_name
  ),
rank_cats as
  (select cat_name,
     sum_mice,
     dense_rank() over (order by sum_mice desc) rnk
   from temp
  )
-- finally:
select cat_name,
  sum_mice
from rank_cats
where rnk < 7;

您可以使用:

SELECT k.pseudo,
       MAX(k.przydzial_myszy) AS przydzial_myszy,
       MAX(k.myszy_extra) AS myszy_extra,
       MAX(k.przydzial_myszy + COALESCE(k.myszy_extra, 0)) AS total
FROM   Kocury k
       LEFT OUTER JOIN Kocury h
       ON (h.przydzial_myszy + COALESCE(h.myszy_extra, 0)
            > k.przydzial_myszy + COALESCE(k.myszy_extra, 0))
GROUP BY k.pseudo
HAVING COUNT(DISTINCT h.przydzial_myszy + COALESCE(h.myszy_extra, 0)) < 3
ORDER BY total DESC

对于样本数据:

CREATE TABLE Kocury (pseudo, przydzial_myszy, myszy_extra) AS
SELECT 'PLACEK',   67, NULL FROM DUAL UNION ALL
SELECT 'RURA',     56, NULL FROM DUAL UNION ALL
SELECT 'LOLA',     25, 47   FROM DUAL UNION ALL
SELECT 'ZERO',     43, NULL FROM DUAL UNION ALL
SELECT 'PUSZYSTA', 20, 35   FROM DUAL UNION ALL
SELECT 'UCHO',     40, NULL FROM DUAL UNION ALL
SELECT 'MALY',     40, NULL FROM DUAL UNION ALL
SELECT 'TYGRYS',  103, 33   FROM DUAL UNION ALL
SELECT 'BOLEK',    50, NULL FROM DUAL UNION ALL
SELECT 'ZOMBI',    75, 13   FROM DUAL UNION ALL
SELECT 'LYSY',     72, 21   FROM DUAL UNION ALL
SELECT 'SZYBKA',   65, NULL FROM DUAL UNION ALL
SELECT 'MALA',     22, 42   FROM DUAL UNION ALL
SELECT 'RAFA',     65, NULL FROM DUAL;

输出:

PRZYDZIAL_MYSZY MYSZY_EXTRA 全部的
泰格里斯 103 33 136
赖西 72 21 93
僵尸 75 13 88

db<> 在这里摆弄

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM