Sql 从另一个用例表达式创建表

Sql 从另一个用例表达式创建表,sql,postgresql,netezza,Sql,Postgresql,Netezza,给出如下表t1 +---------+----------+ | bin_val | bin_cnt | +---------+----------+ | 0 | 2 | | 4 | 10 | | 8 | 15 | | 12 | 12 | | 16 | 6 | | 20 | 1 | +---------+----------+ 我需要创建一个从Net

给出如下表t1

+---------+----------+
| bin_val |  bin_cnt |
+---------+----------+
|       0 |        2 |
|       4 |       10 |
|       8 |       15 |
|      12 |       12 |
|      16 |        6 |
|      20 |        1 |
+---------+----------+
我需要创建一个从Netezza中的表t1中选择的临时表bin_vals_,具体操作如下

CREATE TEMP TABLE bin_vals_selected as (
  -- statements
) DISTRIBUTE ON RANDOM;
我需要编写语句,根据在我的生产界面中可用的变量$bin_selected有条件地从t1中选择bin_val,在将SQL传递给Netezza执行之前,它只是一个简单的字符串替换

在所选的临时表bin\u vals\u中,我需要的内容如下

当$bin_selected='all'时,所选的bin_vals_应包含t1中所有不同的bin_val。这方面的声明如下

SELECT DISTINCT bin_val as bin_selected FROM t1
SELECT bin_val as bin_selected FROM t1 ORDER BY bin_cnt DESC LIMIT 1
当$bin_selected='first'时,所选的bin_vals_应包含t1中具有最多bin_计数的bin_val。这方面的声明如下

SELECT DISTINCT bin_val as bin_selected FROM t1
SELECT bin_val as bin_selected FROM t1 ORDER BY bin_cnt DESC LIMIT 1
当$bin_selected='second'时,所选的bin_vals_应包含t1中的bin_val,该bin_val具有第二多个bin_计数。我不知道该怎么写这个声明

我用一个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为中心的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);

如果您希望在存储单元具有相同计数时允许绑定,请使用密集列组而不是行数。

如果您确实需要使用单个SQL,则可以使用类似于以下内容的并集:

SELECT DISTINCT bin_val as bin_selected 
FROM t1
WHERE 'all' = $bin_selected

UNION ALL

SELECT bin_val as bin_selected
FROM (
  SELECT bin_val, RANK() OVER(ORDER BY bin_cnt DESC) AS BinCountRank
  FROM t1
) src
WHERE BinCountRank = 1
AND 'first' = $bin_selected

UNION ALL

SELECT bin_val as bin_selected
FROM (
  SELECT bin_val, RANK() OVER(ORDER BY bin_cnt DESC) AS BinCountRank
  FROM t1
) src
WHERE BinCountRank = 2
AND 'second' = $bin_selected
这不是很有效,但它应该能起作用。它确实为您的源查询提供了灵活性。你可能得和军衔混在一起才能处理任何关系。它还假设联合字符串中的每个查询都返回具有相同数据类型的完全相同的列


对于您的情况,我会使用上面Gordon的答案…它更干净、更快。

尝试过这个方法-对所有人都很有效,但是第一次没有得到预期的结果8..@user3206440。我修改了答案。我认为这需要聚合,但事实并非如此。您可以直接使用bin_cnt。