Skip to content

MIN Function ​

Calculates the smallest value of the values that are not NULL in expr. If all values in expr are NULL, NULL is returned.

Syntax ​

Aggregate Function ​

sql
MIN([DISTINCT] expr)

Window Function ​

sql
MIN(expr) OVER ([PARTITION BY part]
                 [ORDER BY ord [ASC|DESC] [window_frame]]
                )

Arguments ​

expr: A (qualified) column name.


part (optional): Expression to partition by.


ord (optional): Expression to sort within each partition.


window_frame (cumulative or sliding): Defines the subset of rows within the window for which the aggregated values should be returned.

Usage Notes ​

As a window function (with an OVER clause):

  • A window frame (cumulative or sliding) must be defined. The default value for the window frame, if not specified, is a cumulative window frame RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW.
  • The use of the DISTINCT keyword when this function is used as a window function is ignored.

Examples ​

Example 1 | Aggregate Function ​

sql
SELECT  MIN(col1) AS result1,
        MIN(DISTINCT col1) AS result2,
        MIN(col2) AS result3,
        MIN(DISTINCT col2) AS result4,
        MIN(ord1) AS result5, 
        MIN(grp1) AS result6
FROM    (SELECT 'a' AS ord1, 'g1' AS grp1, '10' AS col1, 10 AS col2
         UNION ALL 
         SELECT 'b' AS ord1, 'g1' AS grp1, '20' AS col1, 20 AS col2
         UNION ALL
         SELECT 'c' AS ord1, 'g1' AS grp1, '20' AS col1, 20 AS col2
         UNION ALL 
         SELECT 'a' AS ord1, 'g2' AS grp1, '30' AS col1, NULL AS col2 
         UNION ALL 
         SELECT 'b' AS ord1, 'g2' AS grp1, '30' AS col1, NULL AS col2 
         UNION ALL 
         SELECT 'c' AS ord1, 'g2' AS grp1, '40' AS col1, 40 AS col2
         UNION ALL 
         SELECT 'a' AS ord1, 'g3' AS grp1, '50' AS col1, NULL AS col2
         UNION ALL 
         SELECT 'b' AS ord1, 'g3' AS grp1, '50' AS col1, NULL AS col2
         UNION ALL 
         SELECT 'c' AS ord1, 'g3' AS grp1, '60' AS col1, 60 AS col2
         UNION ALL
         SELECT 'd' AS ord1, 'g3' AS grp1, '50' AS col1, 50 AS col2);
+---------+---------+---------+---------+---------+---------+
| RESULT1 | RESULT2 | RESULT3 | RESULT4 | RESULT5 | RESULT6 |
+---------+---------+---------+---------+---------+---------+
| 10      | 10      | 10      | 10      | a       | g1      |
+---------+---------+---------+---------+---------+---------+

Example 2 | Window Function ​

sql
SELECT col1, grp1, ord1,
       MIN(col1) OVER(PARTITION BY grp1) AS result1,
       MIN(col1) OVER(PARTITION BY grp1 ORDER BY ord1 ASC) AS result2,
       MIN(col1) OVER(PARTITION BY grp1 ORDER BY ord1 DESC) AS result3
FROM    (SELECT 'a' AS ord1, 'g1' AS grp1, '10' AS col1, 10 AS col2
         UNION ALL 
         SELECT 'b' AS ord1, 'g1' AS grp1, '20' AS col1, 20 AS col2
         UNION ALL
         SELECT 'c' AS ord1, 'g1' AS grp1, '20' AS col1, 20 AS col2
         UNION ALL 
         SELECT 'a' AS ord1, 'g2' AS grp1, '30' AS col1, NULL AS col2 
         UNION ALL 
         SELECT 'b' AS ord1, 'g2' AS grp1, '30' AS col1, NULL AS col2 
         UNION ALL 
         SELECT 'c' AS ord1, 'g2' AS grp1, '40' AS col1, 40 AS col2
         UNION ALL 
         SELECT 'a' AS ord1, 'g3' AS grp1, '50' AS col1, NULL AS col2
         UNION ALL 
         SELECT 'b' AS ord1, 'g3' AS grp1, '50' AS col1, NULL AS col2
         UNION ALL 
         SELECT 'c' AS ord1, 'g3' AS grp1, '60' AS col1, 60 AS col2
         UNION ALL
         SELECT 'd' AS ord1, 'g3' AS grp1, '50' AS col1, 50 AS col2);
+------+------+------+---------+---------+---------+
| COL1 | GRP1 | ORD1 | RESULT1 | RESULT2 | RESULT3 |
+------+------+------+---------+---------+---------+
| 10   | g1   | a    | 10      | 10      | 10      |
| 20   | g1   | b    | 10      | 10      | 20      |
| 20   | g1   | c    | 10      | 10      | 20      |
| 30   | g2   | a    | 30      | 30      | 30      |
| 30   | g2   | b    | 30      | 30      | 30      |
| 40   | g2   | c    | 30      | 30      | 40      |
| 50   | g3   | a    | 50      | 50      | 50      |
| 50   | g3   | b    | 50      | 50      | 50      |
| 60   | g3   | c    | 50      | 50      | 50      |
| 50   | g3   | d    | 50      | 50      | 50      |
+------+------+------+---------+---------+---------+

Example 3 | Window Function with WINDOWING ​

In this example, a sliding window with a width of 4 rows is created. For this window, the highest value is returned. A single partition is used, so there is no PARTITION BY clause in the OVER() clause.

sql
SELECT col1, 
       grp1, 
       MIN(col1) OVER(ORDER BY col1, grp1 ROWS BETWEEN 3 PRECEDING AND CURRENT ROW) AS result1
FROM    (SELECT 'a' AS ord1, 'g1' AS grp1, '10' AS col1, 10 AS col2
         UNION ALL 
         SELECT 'b' AS ord1, 'g1' AS grp1, '20' AS col1, 20 AS col2
         UNION ALL
         SELECT 'c' AS ord1, 'g1' AS grp1, '20' AS col1, 20 AS col2
         UNION ALL 
         SELECT 'a' AS ord1, 'g2' AS grp1, '30' AS col1, NULL AS col2 
         UNION ALL 
         SELECT 'b' AS ord1, 'g2' AS grp1, '30' AS col1, NULL AS col2 
         UNION ALL 
         SELECT 'c' AS ord1, 'g2' AS grp1, '40' AS col1, 40 AS col2
         UNION ALL 
         SELECT 'a' AS ord1, 'g3' AS grp1, '50' AS col1, NULL AS col2
         UNION ALL 
         SELECT 'b' AS ord1, 'g3' AS grp1, '50' AS col1, NULL AS col2
         UNION ALL 
         SELECT 'c' AS ord1, 'g3' AS grp1, '60' AS col1, 60 AS col2
         UNION ALL
         SELECT 'd' AS ord1, 'g3' AS grp1, '50' AS col1, 50 AS col2);
+------+------+---------+
| COL1 | GRP1 | RESULT1 |
+------+------+---------+
| 10   | g1   | 10      |
| 20   | g1   | 10      |
| 20   | g1   | 10      |
| 30   | g2   | 10      |
| 30   | g2   | 20      |
| 40   | g2   | 20      |
| 50   | g3   | 30      |
| 50   | g3   | 30      |
| 50   | g3   | 40      |
| 60   | g3   | 50      |
+------+------+---------+