sql - 使用 CASE 表达式从另一个表创建一个表

标签 sql postgresql netezza

给定如下表 t1

+---------+----------+
| bin_val |  bin_cnt |
+---------+----------+
|       0 |        2 |
|       4 |       10 |
|       8 |       15 |
|      12 |       12 |
|      16 |        6 |
|      20 |        1 |
+---------+----------+

我需要创建一个临时表 bin_vals_selected来自表 t1在 Netezza 中,我按如下方式执行

CREATE TEMP TABLE bin_vals_selected as (
  -- statements
) DISTRIBUTE ON RANDOM;

我需要编写语句来选择 bin_val来自 t1有条件地基于变量 $bin_selected这在我的生产界面中可用(在将 SQL 传递给 Netezza 执行之前,它是一个简单的字符串替换)。

我在临时表中需要什么 bin_vals_selected如下。

$bin_selected = 'all' , bin_vals_selected应包含所有不同的 bin_val来自 t1 .对此的声明如下。

SELECT DISTINCT bin_val as bin_selected FROM t1

$bin_selected = 'first' , bin_vals_selected应包含 bin_val来自 t1哪个最多bin_count .对此的声明如下。

SELECT bin_val as bin_selected FROM t1 ORDER BY bin_cnt DESC LIMIT 1

$bin_selected = 'second' , bin_vals_selected应包含 bin_val来自 t1第二多bin_count .我不确定如何为此编写声明。

我正在用 CASE 来解决这个问题根据变量值创建表的表达式 $bin_selected - 但是它不起作用。

CREATE TEMP TABLE bin_vals_selected AS
(
  SELECT * FROM (
    CASE 
      WHEN $bin_selected = 'all' THEN
        (SELECT DISTINCT bin_val AS bin_selected FROM t1 AS a)
      WHEN $bin_selected = 'first' THEN
        (SELECT bin_val AS bin_selected FROM t1 AS a ORDER BY bin_cnt DESC LIMIT 1 )
    END
  )
) DISTRIBUTE ON RANDOM;

尽管上面的语法是针对 Netezza 的centric (主要像 Postgres ),一个 Postgres解决方案也会有帮助,因为我有本地 Postgres实例来尝试。

最佳答案

我将从使用 group by 开始,然后是一个条件。您可以这样做:

select bin_val
from (select bin_val, ,  -- not really needed
             row_number() over (order by bin_cnt desc) as seqnum
      from t1
     ) t
where ($bin_selected = 'all') or
      ($bin_selected = 'first' and seqnum = 1) or
      ($bin_selected = 'second' and seqnum = 2);

如果您希望在 bin 具有相同计数时允许并列,请使用 dense_rank() 而不是 row_number()

关于sql - 使用 CASE 表达式从另一个表创建一个表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48533219/

相关文章:

MySQL - 如何使用左连接从 on 子句中的连接表中精确获取一行?

json - 如何将json压平成表格

postgresql - 使用 SIS 执行 postgres dbinit 的批处理文件给出了被拒绝的权限

php - 这与 sql_mode=only_full_group_by 不兼容

python - 带有 JOIN 和 GROUP BY SQL 查询的 Django COUNT

sql - 基本sql : Outputting headers surrounded by double quotes

Netezza 从外部文件导入错误 : Unsupported external table reference, 无法导出形状

PostgreSQL 9.3 触发器函数插入到具有参数化名称的表中

java - 极慢的 Netezza(数据库)批量插入

hadoop - Netezza Squoop选项文件-如何在代码升级中进行处理