相关疑难解决方法(0)

unpivot和PostgreSQL

PostgreSQL中是否有一个unpivot等效函数?

postgresql unpivot

28
推荐指数
6
解决办法
3万
查看次数

你会如何使用Squeel进行这个Rails子查询?

我想使用Squeel重构下面的查询.我想这样做,以便我可以链接其中的运算符并重新使用查询的不同部分中的逻辑.

User.find_by_sql("SELECT 
    users.*,
    users.computed_metric,
    users.age_in_seconds,
    ( users.computed_metric / age_in_seconds) as compound_computed_metric
    from
    (
      select
        users.*,
        (users.id *2 ) as computed_metric,
        (extract(epoch from now()) - extract(epoch from users.created_at) ) as age_in_seconds
        from users
    ) as users")
Run Code Online (Sandbox Code Playgroud)

查询必须全部在DB中运行,并且不应该是混合Ruby解决方案,因为它必须对数百万条记录进行排序和切片.

我已经设置了问题,因此它应该针对普通user表运行,以便您可以使用它的替代方案.

对可接受答案的限制

  • 查询应返回User具有所有常规属性的对象
  • 每个用户对象也应该包括extra_metric_we_care_about,age_in_secondscompound_computed_metric
  • 查询不应该只通过在多个地方打印出一个字符串来复制任何逻辑 - 我想避免两次做同样的事情
  • [更新]查询应该在数据库中都可以执行,以便在返回到Rails之前,可以在数据库中对可能包含数百万条记录的结果集进行排序和切片
  • [更新]该解决方案适用于Postgres数据库

我想要的解决方案类型示例

下面的解决方案不起作用,但它显示了我希望实现的优雅类型

class User < ActiveRecord::Base
# this doesn't work - it just illustrates what I want to achieve

  def self.w_all_additional_metrics
    select{ ['*', 
              computed_metric, 
              age_in_seconds, 
              (computed_metric …
Run Code Online (Sandbox Code Playgroud)

activerecord ruby-on-rails arel squeel

9
推荐指数
1
解决办法
4090
查看次数

PostgreSQL视图:引用另一个计算字段中的一个计算字段

我和#1895500有同样的问题,但PostgreSQL不是MySQL.

如何定义具有计算字段的视图,例如:

 (mytable.col1 * 2) AS times_two
Run Code Online (Sandbox Code Playgroud)

...并创建另一个基于第一个的计算字段:

 (times_two * 2) AS times_four
Run Code Online (Sandbox Code Playgroud)

...?

sql postgresql calculated-columns sql-view

6
推荐指数
1
解决办法
3436
查看次数

在 select 子句中重用学说别名

我在 Doctrine 中有以下 SELECT 子句(查询本身是使用查询构建器创建的):

u.username,
MAX(p.score) as highscore,
SUM(pc.badgeCount) as badgeCount,
(SUM(pc.badgeCount) / :badgeSum) AS probability,
(-LOG(RAND()) * probability) as weight
Run Code Online (Sandbox Code Playgroud)

p是主实体的别名,pc是连接实体)

这给了我来自 MySQL 的错误消息:

SQLSTATE[42S22]: Column not found: 1054 Unknown column 'probability' in 'field list'
Run Code Online (Sandbox Code Playgroud)

如何在同一个 SELECT 子句中重用创建的别名?

php mysql doctrine doctrine-orm

6
推荐指数
1
解决办法
518
查看次数

PostgreSQL:如何将两列相乘并在同一查询中显示结果?

我有一个查询,它的select语句是这样的:

select Greatest(p.price,0) as newprice, sum(q.qty) as qty
from ....
Run Code Online (Sandbox Code Playgroud)

它给了我:

     newprice qty
      10      1
      0       1
      100     2
      1       2
Run Code Online (Sandbox Code Playgroud)

我想将newprice与qty相乘得到:

    newprice  qty   result
      10      1      10
      0       1      0
      100     2     200
      1       2      2
Run Code Online (Sandbox Code Playgroud)

当我尝试这样做select Greatest(p.price,0) as newprice, sum(q.qty) as qty, newprice * qty时说

ERROR: column "newprice" does not exist
Run Code Online (Sandbox Code Playgroud)

我真的不需要这个额外的专栏.

我真正想要的是:SUM(Greatest(p.price,0) * SUM(q.qty)) 它应该给出价值,212但它说ERROR: aggregate function calls cannot be nested

基本上我只需要将两列相乘并对结果求和.我知道我可以使用类似于此处所示的CTE ,但我想知道是否有更简单的方法来减少代码.

sql postgresql

4
推荐指数
1
解决办法
8960
查看次数

如何在 Postgres 中使用具有多个分位数的percentile_conts

我目前有一个查询,其工作方式如下:

select AVG(t2 - t1) as delay,
       percentile_cont(0.25) within group (order by (t2 - t1)) as q25,
       percentile_cont(0.5) within group (order by (t2 - t1)) as median,
       percentile_cont(0.75) within group (order by (t2 - t1)) as q75,
       p.bool1,
       p.cat1
from people p
group by p.bool1, p.cat1
order by p.cat1,p.bool1
Run Code Online (Sandbox Code Playgroud)

但是,我在 postgres 函数聚合页面上阅读: https://www.postgresql.org/docs/9.4/functions-aggregate.html

我应该能够指定多个分位数:

percentile_cont(fractions) WITHIN GROUP (ORDER BY sort_expression)  double precision[]  double precision or interval    array of sort expression's type     multiple continuous percentile: returns an array of results matching …
Run Code Online (Sandbox Code Playgroud)

postgresql quantile percentile-cont

3
推荐指数
1
解决办法
2410
查看次数

如何从 PostgreSQL 中的文本中删除分隔部分?

我想从字符串中消除一些文本模式,我的字符串有一个管道分隔符,并且参数并不总是相互跟随。

这是我的字符串

TType=SEND|Status=OK|URL=min://j?_a=3&ver=1.1|day=3
Run Code Online (Sandbox Code Playgroud)

我想消除TType=SENDURL=min://j?_a=3&ver=1.1

因此我的最终结果应该是

Status=OK|day=3
Run Code Online (Sandbox Code Playgroud)

我尝试过的。不适 用于 postgresql

select REGEXP_REPLACE('TType=SEND|Status=OK|URL=min://j?_a=3&ver=1.1|day=3', 
'(TType=.*?(\||$))|(URL=.*?(\||$))', '')
Run Code Online (Sandbox Code Playgroud)

regex sql postgresql replace string-function

2
推荐指数
1
解决办法
255
查看次数