【问题标题】:SQL Server minimum value within columnSQL Server 列中的最小值
【发布时间】:2019-05-08 22:22:20
【问题描述】:

我有table_1 有以下数据:

| STORE | Add | dis | Cnt | 
+-------+-----+-----+-----+
|   101 | X   | abc | 2   | 
|   101 | X   | null| 3   | 
|   101 | X   |pqrd | 4   | 
|   101 | X   | null| 1   | 
|   102 | y   | null| 1   | 
|   102 | y   | xyz | 3   | 
|   102 | y   | pqr | 4   | 
|   102 | y   | null| 2   | 

我尝试构建一个查询以从 table_1 获取数据,其中 [dis] 不为空且 [cnt] 应为最小值。所以我的结果应该如下所示:

| STORE | Add | dis | Cnt | 
+-------+-----+-----+-----+
|   101 | X   | abc | 2   | 
|   102 | y   | xyz | 3   | 

我的查询如下所示:

SELECT store,add,dis,min(TMPLT_PRIORITY_NMBR)
FROM table_1 group by store,add;

但我收到以下错误:

选择列表中的“dis”列无效,因为它既不包含在聚合函数中,也不包含在 GROUP BY 子句中。

如果我在 GROUP BY 子句中使用 [dis],我会得到错误的结果,并且给出 max(dis) 或 min(dis) 也会提供错误的结果。

这个问题的解决方案是什么?

【问题讨论】:

    标签: sql sql-server tsql select


    【解决方案1】:

    您可以使用rank 找到每个存储/添加组合具有最小cnt 值的行,并从中返回所有列:

    SELECT store, add, dis, cnt
    FROM   (SELECT *, RANK() OVER (PARTITION BY store, add ORDER BY cnt) AS rk
            FROM   table_1
            WHERE  dis IS NOT NULL) t
    WHERE  rk = 1
    

    【讨论】:

      【解决方案2】:

      另一种选择是将first_valueminover 一起使用:

      SELECT distinct store,
             add,
             first_value(dis) over(partition by store, add order by Cnt) as dis,
             min(Cnt) over(partition by store, add) as cnt
      FROM table_1 
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-08-27
        • 2014-02-04
        • 2019-03-18
        • 2015-09-07
        • 2020-12-14
        • 1970-01-01
        • 2015-06-04
        • 1970-01-01
        相关资源
        最近更新 更多