给定如下表 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/