【问题标题】:Minimum value of a column corresponding to another column value与另一列值对应的列的最小值
【发布时间】:2016-07-22 03:42:52
【问题描述】:

我在下面有这个数据表,我是从数据库中提取的

  type   week  amount
    a   201304  77
    a   201304  77
    a   201304  77
    a   201304  77
    a   201304  71
    a   201304  71
    a   201305  77
    a   201305  77
    a   201305  77
    a   201305  77
    a   201305  77
    a   201305  77

我试图仅从每周的amount 列中提取最小值,因此该表应该是这样的

  type   week  amount
    a   201304  71
    a   201305  77

感谢您的帮助

【问题讨论】:

标签: sql sql-server


【解决方案1】:

这个普通的GROUP BY 有什么问题?

SELECT type, week, MIN(amount) amount
FROM table_name
GROUP BY type, week

编辑

如果你在同一周有不同的类型,数量相同,你想做什么?如果您想知道一周内哪种类型的 MIN(amount):

SELECT DISTINCT t2.*
FROM
 (SELECT week, MIN(amount) amount
    FROM table_name
    GROUP BY week) t1
  JOIN table_name t2 ON t1.amount = t2. amount AND t1.week = t2.week

【讨论】:

    【解决方案2】:

    试试

    Select type, week, amount 
    from
        (Select type, week, amount, row_number () over(partition by week, amount order by amount asc) as rownumber
         from table_name)
    where rownumber = 1
    

    它的作用是将行号分配给仅包含周数和数量的分区。您每周可能有很多金额。这会对它们进行编号,然后对它们进行排序,以便最小的在顶部(第 1 行)。您在 where 子句中只得到这一行。无论类型如何,这将每周产生最低数量。

    【讨论】:

    • 您不能在 where 子句中使用 rownumber,因为 SQL 在计算结果集时将无法理解别名。此外,窗口函数也不能在 where 子句中使用。但是,您可以从您的选择中选择作为子选择或公用表表达式
    • @Matt 感谢您的指导。我编辑了我的答案。如果还有什么不正确的地方,请告诉我。
    【解决方案3】:

    你可以使用 min and in 子句

     select * from my_table 
     where (amount, week ) in (
        select min(amount), week from my_table group by week 
     );
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-02-05
      • 2014-06-15
      • 2018-08-25
      • 2020-05-20
      • 1970-01-01
      • 1970-01-01
      • 2021-04-11
      相关资源
      最近更新 更多