有两列按顺序使用别名

时间:2016-01-15 10:29:27

标签: sql vertica

我有这个问题:

select 
    id,
    count(1) as "visits",
    count(distinct visitor_id) as "visitors"
from my_table
where timestamp > '2016-01-14'
group by id
order by "visits", "visitors"

有效。

如果我改用这个

select 
    id,
    count(1) as "visits",
    count(distinct visitor_id) as "visitors"
from my_table
where timestamp > '2016-01-14'
group by id
order by (("visits") + ("visitors"))

我得到了

  

列“访问”不存在

如果我换到  选择         ID,         将(1)计为“访问”,         将(distinct visitor_id)计为“访客”     来自my_table     其中时间戳> “2016年1月14日”     按ID分组     按次数排序(1)+计数(distinct visitor_id)

它再次起作用。

为什么它适用于示例1和3,但不适用于示例2?有没有办法通过两列的总和使用它们的别名来订购?

我能想到的替代方案:

  • 创建一个外部选择并对其进行排序,但这会产生额外的代码,我想避免使用
  • 按顺序重新计算按顺序排列的值。但这会使查询变得更复杂,也许我会因为重新计算内容而失去性能。

PS:此查询是玩具查询。真正的一个要复杂得多。我想按顺序重用select语句中计算的值,但是所有这些总结在一起。

2 个答案:

答案 0 :(得分:2)

未定义表达式评估顺序。如果在别名之前评估visits + visitors表达式,则会出现上面显示的错误。

答案 1 :(得分:0)

尝试使用实际列而不是使用别名尝试将类型更改为varchar或nvarchar,并且我的意思是:

select 
    id,
    count(1) as "visits",
    count(distinct visitor_id) as "visitors"
from my_table
where timestamp > '2016-01-14'
group by id
order by (CAST(count(1) AS VARCHAR) + CAST(count(distinct visitor_id) AS VARCHAR))