【问题标题】:sql select min or max based on conditionsql 根据条件选择最小值或最大值
【发布时间】:2015-08-06 13:07:43
【问题描述】:

大家好,我正在尝试根据这些条件从一系列数据中选择最小值或最大值:

  • 如果 setuptime 和 processtime cols 都是 0 选择 MIN(oprNum) (操作尚未开始,请先获取 oprnum)
  • 如果 setuptime 和 process time 不为 0,则获取 max oprnum(主动操作)。

基于其中任何一个,我想要一行...请参阅随附的数据示例。谢谢!这是一个更大的查询的一部分,所以我需要每个 prodid 1 个输出行...

+------------+--------+---------+--------------------+--------------------+
| ProdId     | OprNum | Company | SetupTime          | ProcessTime        |
+------------+--------+---------+--------------------+--------------------+
| 12M0003381 | 10     | 12      | 1.3400000000000000 | 1.6100000000000000 |
+------------+--------+---------+--------------------+--------------------+
| 12M0003381 | 10     | 12      | 0.0000000000000000 | 0.0000000000000000 |
+------------+--------+---------+--------------------+--------------------+
| 12M0003381 | 15     | 12      | 1.0000000000000000 | 0.0000000000000000 |
+------------+--------+---------+--------------------+--------------------+
| 12M0003381 | 50     | 12      | 0.0000000000000000 | 0.0000000000000000 |
+------------+--------+---------+--------------------+--------------------+
| 12M0003381 | 60     | 12      | 0.0000000000000000 | 0.0000000000000000 |
+------------+--------+---------+--------------------+--------------------+
| 12M0003381 | 60     | 12      | 0.0000000000000000 | 0.0000000000000000 |
+------------+--------+---------+--------------------+--------------------+
| 12M0003381 | 70     | 12      | 0.0700000000000000 | 0.0400000000000000 |
+------------+--------+---------+--------------------+--------------------+
| 12M0003381 | 70     | 12      | 0.0000000000000000 | 0.0000000000000000 |
+------------+--------+---------+--------------------+--------------------+

【问题讨论】:

标签: sql-server sql-server-2012


【解决方案1】:

更新的查询:基于上次评论

如果最大记录有 0 次,我想选择最后一条记录 有设置时间或处理时间。如果我将此行添加到您的小提琴中 ('12M0003381',80,12,0.00,0.00) 当我想要最后一行时,我得到了这一行 带有设置时间或处理时间

这个查询使用的逻辑是简单地计算一个额外的列weighted_value。在外部查询中,我们像以前一样使用 min over value 和 max over weighted value。

select 
  t.prodId,
  case when MAX(t.setuptime+ t.processtime)>0 then MAX(t.weighted_value) else MIN(t._value) end as value
from (
    select 
         prodID,
         oprnum as _value,
         setuptime,
         processtime,
         case 
           when setuptime+processtime>0 
           then oprnum 
           else NULL 
           end as weighted_value from tbl
    ) t
group by t.prodID

更新小提琴链接:http://sqlfiddle.com/#!6/b7ecb/20

请试试这个查询

select t1.ProdId, case when exists(
select 1 from tbl  t2 where t2.setuptime >0 or t2.Processtime>0 and t2.prodId=t1.prodId
)  then MAX(t1.oprNum) ELSE MIN(t1.oprNum) END
from tbl t1
group by ProdId

sql小提琴链接http://sqlfiddle.com/#!6/c52e22/1

【讨论】:

  • 这与另一个相同,但是如果最大记录有 0 次,我在上一条评论中说过,我想选择具有设置时间或处理时间的最后一条记录。如果我将此行添加到您的小提琴 ('12M0003381',80,12,0.00,0.00) 中,当我想要最后一个带有设置时间或处理时间的行时,我会得到这一行,谢谢您的帮助。
  • 我刚刚注意到底部的 where 子句将过滤掉所有 0 processtime 和 0 setuptime 的任何记录可能应该是... where t1.setuptime >= 0 OR t1.processtime >= 0?
  • 是的,我就是这么做的。我更新了您的小提琴,将所有时间更改为 0,然后返回 0 行,在这种情况下,我想要 MIN(oprnum)... 这将是 10...
  • 非常感谢您在这方面的帮助......这不是那么简单......你能向我解释一下 ELSE NULL 吗?为什么不是 ELSE 0 之类的?这对结果有何影响...
  • 我使用了NULL,因为所有聚合函数,如MAXMIN 都忽略了NULL 值,我们不想考虑这些值。基本上这里的加权值要么是原始值,要么不是。在这种情况下,MAX 和 MIN 将不受 0 值的影响。但是假设我们必须处理包含负值的范围,我们会更安全NULL
【解决方案2】:

一种方式:

SELECT 
    ProdId, 
    CASE WHEN SUM(SetupTime) + SUM(ProcessTime) = 0 THEN MIN(oprNum) ELSE MAX(oprNum) END 
FROM T
GROUP BY ProdId

【讨论】:

  • 我想这就是我所追求的!不敢相信我竟然这么愚蠢,没想到这一点……我一直在四处寻找解决方案……
  • 我如何扩展它以显示有时间的 MAX(OprNum)?所以在理想情况下,我想在最大部分添加 MAX(oprNum) WHERE setuptime + processtime 0...
猜你喜欢
  • 2015-10-31
  • 2015-11-04
  • 1970-01-01
  • 2012-09-30
  • 1970-01-01
  • 2020-05-16
  • 1970-01-01
  • 1970-01-01
  • 2019-07-31
相关资源
最近更新 更多