【问题标题】:How to have a CASE WHEN query with multiple THEN in it?如何在 CASE WHEN 中有多个 THEN 查询?
【发布时间】:2017-02-27 12:26:48
【问题描述】:

我的代码写成:

SELECT name, age,
  CASE WHEN abs(10 - mean(valueLeft)) < abs(10 - mean(valueRight)) THEN stddev(valueLeftMagnitude) ELSE stddev(valueRightMagnitude) END as value1,
  CASE WHEN abs(10 - mean(valueLeft)) < abs(10 - mean(valueRight)) THEN mean(valueLeftMagnitude) ELSE mean(valueRightMagnitude) END as value2,
  CASE WHEN abs(10 - mean(valueLeft)) < abs(10 - mean(valueRight)) THEN median(valueLeftMagnitude) ELSE median(valueRightMagnitude) END as value3
FROM table
GROUP BY name, age

由于所有三个 CASE 中的 WHEN 语句都是相同的,我不想重复它们。有什么办法吗?

示例:我想要类似 -

SELECT name, age,
  CASE WHEN abs(10 - mean(valueLeft)) < abs(10 - mean(valueRight))
    THEN stddev(valueLeftMagnitude) ELSE stddev(valueRightMagnitude) END as value1,
    THEN mean(valueLeftMagnitude) ELSE mean(valueRightMagnitude) END as value2,
    THEN median(valueLeftMagnitude) ELSE median(valueRightMagnitude) END as value3
FROM table
GROUP BY name, age

请帮忙。

【问题讨论】:

  • 没有。剪切&粘贴&修改。
  • 标记您的 DBMS。 sql-server 有交叉应用,在这里可以很方便。
  • 嵌入式选择也很有用,即嵌入式查询进行计算,外部查询进行选择。

标签: sql pyspark


【解决方案1】:

这就是嵌入式选择如何确保您只执行一次case 计算:

SELECT perprocessed.name, perprocessed.age, stddev(perprocessed.valueMagnitude), mean(perprocessed.valueMagnitude), median(perprocessed.valueLeftMagnitude) from
(SELECT
  name,
  age,
  CASE WHEN abs(10 - mean(valueLeft)) < abs(10 - mean(valueRight)) THEN valueLeftMagnitude ELSE valueRightMagnitude END as valueMagnitude
  FROM table) as perprocessed
GROUP BY perprocessed.name, perprocessed.age

【讨论】:

    【解决方案2】:

    您的查询非常易读,我认为复制粘贴表达式没有真正的缺点。如果您只想进行一次此评估,则查询会稍微复杂一些,因为您需要分两步进行:

    SELECT
      CASE WHEN which = 'left' THEN stddev_left ELSE stddev_right END AS value1,
      CASE WHEN which = 'left' THEN mean_left   ELSE mean_right   END AS value2,
      CASE WHEN which = 'left' THEN median_left ELSE median_right END AS value3
    FROM
    (
      SELECT 
        name, 
        age, 
        CASE WHEN abs(10 - mean(valueLeft)) < abs(10 - mean(valueRight)) 
             THEN 'left' ELSE 'right' END AS which,
        stddev(valueLeftMagnitude) AS stddev_left,
        stddev(valueRightMagnitude) AS stddev_right,
        mean(valueLeftMagnitude) AS mean_left,
        mean(valueRightMagnitude) AS mean_right,
        median(valueLeftMagnitude) AS median_left,
        median(valueRightMagnitude) median_right
      FROM table 
      GROUP BY name, age
    ) grouped;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-09-13
      • 2021-08-04
      • 2013-03-25
      • 1970-01-01
      • 2011-08-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多