【问题标题】:SQL min functionSQL min 函数
【发布时间】:2016-03-22 08:20:10
【问题描述】:

我正在尝试获取两列,frequencyfrequency - min(frequency),但我看到的第二列为零。可能有什么问题?

SELECT
    frequency, frequency - min(frequency)
    FROM
    words
GROUP BY id
ORDER BY frequency;

【问题讨论】:

  • 请显示一些示例数据。您显示的数据似乎很好:1-1 = 0, 5-5 = 0。我确定这不是您的意思...
  • 您使用的是mysql 还是postgresql?这是两个非常不同的数据库。
  • 我需要整个表的最小频率。我猜它正在考虑该行的最小频率
  • @Mureinik ... 编辑标签.. 使用 postgresql

标签: sql postgresql select min


【解决方案1】:

添加返回最小频率值的子查询:

SELECT
    frequency, frequency - (select min(frequency) from words)
    FROM
    words
ORDER BY frequency;

编辑:

将其包装在派生表中:

SELECT frequency, frequency - minfreq, frequency + minfreq
FROM words
    CROSS JOIN (select min(frequency) minfreq from words) dt
ORDER BY frequency

【讨论】:

  • 啊...我们可以命名 (select min(frequency) from words) 并一遍又一遍地使用它而不是编写子查询吗?
  • SELECT frequency, frequency - minfreq, frequency + minfreq FROM words where minfreq = (select min(frequency) from words) ORDER BY frequency;这甚至可能吗?
  • SELECT frequency, frequency - minfreq, frequency + minfreq FROM words, (select min(frequency) minfreq from words) t ORDER BY frequency
  • 添加了替代方案,如建议的 splash58。
【解决方案2】:

您的查询按频率的唯一值分组。在每个这样的组中,最小频率只是频率本身,所以当减去两者时,你总是得到0。相反,您可以使用 min 的窗口版本:

SELECT   frequency, frequency - MIN(frequency) OVER() AS diff
FROM     words
ORDER BY frequency

【讨论】:

    【解决方案3】:

    试试看:

    SELECT frequency, frequency-min_frequency
    FROM ( 
    SELECT frequency,  MIN(frequency) AS min_frequency 
    FROM words
    GROUP BY frequency
    ) as A 
    ORDER BY frequency;
    

    【讨论】:

      【解决方案4】:

      这当然是一个奇怪的问题。您按 ID 分组,因此每个 ID 获得一个结果记录。但 ID 表明这是唯一标识记录的表的 ID。所以GROUP BY id 不会改变任何东西,您仍然会在结果中获得所有记录。除了一个例外:min(frequency) 现在表示每组的最小频率。由于“组”是一个记录,最小值当然是值本身。非聚合的frequency 也是由 ID 唯一标识的记录频率。所以你的查询可以重写为:

      SELECT
        frequency, frequency - frequency
      FROM words
      ORDER BY frequency;
      

      我想您想将每条记录的频率与表中找到的最小频率进行比较?你会在子查询中得到这个值:

      SELECT
        frequency, frequency - (select min(frequency) from words)
      FROM words
      ORDER BY frequency;
      

      或者:

      SELECT
        w.frequency, w.frequency - m.min_frequncy
      FROM words w
      CROSS JOIN (select min(frequency) as min_frequncy from words) m
      ORDER BY frequency;
      

      【讨论】:

        猜你喜欢
        • 2017-08-06
        • 2012-07-07
        • 2013-01-28
        • 1970-01-01
        • 2021-11-29
        • 2017-04-09
        • 2019-06-03
        • 2020-09-26
        • 2012-03-25
        相关资源
        最近更新 更多