【问题标题】:finding highest count of same last digits in multiple colums在多列中查找相同最后一位的最高计数
【发布时间】:2017-05-14 12:03:48
【问题描述】:

我需要计算不同列之间最后一位数字的重复值存在多少次。我对最高计数感兴趣。

    Col1   Col2   Col3   Col4   Col5
    ----   ----   ----   ----   ---- 
     1       13    23      21    31    = result should be 3 for 3 time the 1.

希望这是有道理的。

如果可以使用 SQL,有什么想法吗?

提前感谢您的所有帮助!

【问题讨论】:

  • 所以查询应该为这一行返回3,但它会返回与表中一样多的行的值吗?而且只有 5 列吗?
  • 感谢您的回复!是的,表有多行,查询需要单独评估每一行。该表实际上有 6 列,但只需要评估这 5 列。
  • 列有主键吗?是第六栏吗? (我可能有一个解决方案,但它需要一个主键。)
  • 不,第 6 列是“标志”列。目前没有钥匙 - 但这并不意味着我不能添加一个:-)。

标签: sql


【解决方案1】:

假设有一个主键,我可能有一个解决方案:

SELECT id, MAX(count) FROM (
    SELECT id, val, COUNT(*) AS count FROM (
        SELECT id, MOD(col1, 10) AS val FROM your_table
        UNION ALL SELECT id, MOD(col2, 10) AS val FROM your_table
        UNION ALL SELECT id, MOD(col3, 10) AS val FROM your_table
        UNION ALL SELECT id, MOD(col4, 10) AS val FROM your_table
        UNION ALL SELECT id, MOD(col5, 10) AS val FROM your_table) vals
    GROUP BY id, val) counts
GROUP BY id;

请注意,这些函数是特定于 mysql 的,但类似的函数应该存在于几乎任何其他数据库中。

Innermost SELECT 使用 id 和 val 列构建派生表,其中 val 是每列的最后一个数字。 Next SELECT out from that 按 id 计算每个值。最外层 SELECT 按 id 返回最大值。

然后,如果您希望在列值旁边显示结果,您只需将此查询与原始表连接起来:

SELECT col1, col2, col3, col4, col5, max_count
  FROM your_table yt
       JOIN (
SELECT id, MAX(count) max_count FROM (
    SELECT id, val, COUNT(*) AS count FROM (
        SELECT id, MOD(col1, 10) AS val FROM your_table
        UNION ALL SELECT id, MOD(col2, 10) AS val FROM your_table
        UNION ALL SELECT id, MOD(col3, 10) AS val FROM your_table
        UNION ALL SELECT id, MOD(col4, 10) AS val FROM your_table
        UNION ALL SELECT id, MOD(col5, 10) AS val FROM your_table) vals
    GROUP BY id, val) counts
GROUP BY id) mc ON yt.id = mc.id;

这是输出:

+------+------+------+------+------+-----------+
| col1 | col2 | col3 | col4 | col5 | max_count |
+------+------+------+------+------+-----------+
|    1 |   13 |   23 |   21 |   31 |         3 |
+------+------+------+------+------+-----------+

【讨论】:

  • 嗯,不认为它的工作。我创建了一个标识主键列 ID。我不得不在我的环境中修改您的查询工作(也许我在那里犯了一个错误?)。我得到的结果是带有 ID(键索引)的行和带有 1 的另一列。1 在所有行中。 (无法发布修改后的代码)
  • 是的,抱歉,我必须做一些更改。现在就试试。 UNION vs UNION ALL 显然非常重要。 :) UNION 本身会删除所有重复项,这就是您获得 1 的原因。
  • 宾果游戏,不错!!!!那行得通,正是我想要的。非常感谢您的帮助! (我是这个论坛的新手——点击你的答案旁边的复选标记是给你评分的正确方法吗?)
  • @Gunnar 是的,这给了我荣誉。很高兴我能帮上忙。这实际上是一种有趣的解决方法。
  • 我知道直接的 SQL 编码,但没有像这样花哨的东西。在接下来的几天里,我可能会有更多类似的情况,但我会先试一试。过去我总是在实际的应用程序(vb.net)中对此进行编码。但我认为以 sql 方式执行此操作更清洁、更快。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-28
  • 1970-01-01
  • 1970-01-01
  • 2014-12-31
  • 2016-02-05
相关资源
最近更新 更多