繁体   English   中英

如何 SELECT DISTINCT() 然后将最频繁值的行保留在另一列中?

[英]How to SELECT DISTINCT() and then keep rows with most frequent value in another column?

示例表列:

  x    y
255    0
255    0
  5   10
  5    0
  5    1
  5    0
255    0
255    0
  2    5
  2    2
  2    5
255    0

第一步是识别 X 的唯一值:

SELECT distinct(X) FROM nodes ORDER BY X

结果:

  2
  5
255

注意:Order by 不是必需的,它可以使结果更易于阅读。

对于 x 列中的每个值,我想在 y 列中找到最常见的值(仅针对共享相同 X 值的行,而不是整个表)和 output 那一行。

我可以很容易地手动完成:

  SELECT x, y, COUNT(y) AS 'n' 
    FROM nodes 
   WHERE x = 2           /* Manually edit this number to get desired result */
GROUP BY y 
ORDER BY COUNT(y) DESC 
   LIMIT 1

结果:

when x = 2        2, 5, 2
when x = 5        5, 0, 2
when x = 255    255, 0, 5

注意:我不需要 output COUNT(y) AS 'n' 它包含在这里是为了更容易看到正在发生的事情。

我可以在 Python 中执行此操作,方法是遍历第一个查询中的唯一 x 值并将该数字插入每个循环的第二个查询中。 我也可以只使用这样的查询并在 Python 中完成所有工作:

SELECT x, y FROM nodes ORDER BY x

我更愿意使用 SQL 在一个查询中完成所有操作。

有没有办法表达“对于查询 #1 中的每个 x,在 WHERE 子句中使用 x 运行查询 #1”的想法,以从一个查询操作中提供单个结果?

使用FIRST_VALUE() window function:

SELECT DISTINCT x, 
       FIRST_VALUE(y) OVER (PARTITION BY x ORDER BY COUNT(*) DESC) y
FROM tablename
GROUP BY x, y;

请参阅演示

暂无
暂无

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

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