【问题标题】:Remove the line with the same name but different value删除同名但值不同的行
【发布时间】:2022-01-16 11:30:08
【问题描述】:

所以基本上我在 sql 中运行这段代码:

SELECT p.Nome as Nome_pub, a.Nome as Nome_area, COUNT(*) as total
FROM publicacao p, emprestimo e, area_tematica a
WHERE p.Id=e.Publicacao_Id and p.Area_Tematica_Id=a.Id and (Data_hora>='2021-01-01' AND Data_de_devolucao<='2021-06-31')
GROUP by p.Nome  
ORDER BY Nome_area;

我得到以下输出

Nome_pub Nome_area total
name1 a 1
name2 b 1
name3 c 1
name4 d 3
name5 d 2
name6 d 2
name7 e 1

但我想要一个输出,它基本上基于 word2 为我提供最大 word3:(在我的情况下,删除带有“name5”和“name6”的行

Nome_pub Nome_area total
name1 a 1
name2 b 1
name3 c 1
name4 d 3
name7 e 1

有什么办法吗?

提前致谢!!

【问题讨论】:

  • 您正在使用一种我们在大约 30 年前就停止使用的连接语法。谁教你的?最好退出那个教程、老师或书。请切换到显式连接(INNER JOINLEFT OUTER JOIN 等)

标签: mysql sql


【解决方案1】:

如果ROW_NUMBER 在您的版本中可用。

SELECT Nome_pub, Nome_area, total
(
    SELECT 
      p.Nome as Nome_pub
    , a.Nome as Nome_area
    , COUNT(*) as total
    , ROW_NUMBER() OVER (PARTITION BY a.Nome ORDER BY COUNT(*) DESC) as RN
    FROM publicacao p
    JOIN emprestimo e
      ON p.Id = e.Publicacao_Id
    JOIN area_tematica a
      ON a.Id = p.Area_Tematica_Id
    WHERE (        Data_hora >= DATE '2021-01-01' AND 
           Data_de_devolucao <  DATE '2021-07-01')
    GROUP by p.Nome, a.Nome
) q
WHERE RN = 1 
ORDER BY Nome_area;

【讨论】:

  • 是的,这是直截了当的方式。 OP 可能想要使用RANK 而不是ROW_NUMBER,具体取决于他们想要如何处理关系。而且我会使用正确的日期文字(Data_hora &gt;= DATE '2021-01-01'。取决于Data_de_devolucao 的数据类型,即如果它也可以包含时间,那么使用独占的Data_de_devolucao &lt; DATE '2021-07-01' 会更安全。
猜你喜欢
  • 1970-01-01
  • 2011-11-21
  • 2017-02-15
  • 1970-01-01
  • 2013-02-22
  • 2018-08-09
  • 1970-01-01
  • 2022-08-11
  • 2021-11-15
相关资源
最近更新 更多