小编Pea*_*gee的帖子

如何在 Postgres 的窗口函数中获取 mode()?

我试图获取mode()分组数据集的 ,但没有对结果进行分组。(使用 Postgres 9.5,如果需要可以升级。)

例如,用户有一个“最喜欢的颜色”,并且属于一个组。获取mode()组内具有“最喜欢的颜色”的用户列表。

窗口函数适用于大多数聚合,但mode()似乎是与窗口函数不兼容的例外。有没有其他方法可以解决这个问题?这是我到目前为止一直在玩的东西......

有效但给出分组结果,我正在寻找未分组的结果:

SELECT group_id, 
    mode() WITHIN GROUP (ORDER BY color)
FROM users
GROUP BY group_id;
Run Code Online (Sandbox Code Playgroud)

无效的语法(只是我试图完成的一个例子):

SELECT id, color, group_id, 
    mode(color) OVER (PARTITION BY group_id)
FROM users;
Run Code Online (Sandbox Code Playgroud)

或者:

SELECT id, color, group_id, 
    mode() WITHIN GROUP (ORDER BY color) OVER (PARTITION BY group_id)
FROM users;
Run Code Online (Sandbox Code Playgroud)

我尝试使用横向连接,但如果不在连接WHERE内部和外部重新迭代我的子句,就无法使其正常工作(当此查询变得更复杂时,我不希望这样做):

SELECT u1.id, u1.group_id, u1.color, mode_color
FROM users u1
LEFT JOIN LATERAL
    (SELECT group_id, mode() WITHIN GROUP (ORDER BY color) as mode_color
     FROM …
Run Code Online (Sandbox Code Playgroud)

sql postgresql aggregate-functions greatest-n-per-group window-functions

5
推荐指数
1
解决办法
1672
查看次数

如何使用 Postgres jsonb '?' Laravel 中的运算符是否支持索引?

我正在尝试使用 jsonb 存在运算符 '?' 在 Laravel 的查询生成器中,并让它使用索引,但我遇到了一些问题。

示例查询

DB::table('table_name')->whereRaw("jsonb_column ? 'key'")->get();

样本索引

CREATE INDEX ON table_name USING GIN(jsonb_column jsonb_ops)

主要问题似乎是“?” 保留用于参数替换,因此该查询返回语法错误。我找到了几种解决此问题的方法,但每种方法都不是完整的解决方案。

  1. 使用 '??' (逃避的方法?) ->whereRaw("jsonb_column ?? 'key'")

    • 不适用于查询生成器。回报SQLSTATE[42883]: Undefined function: 7 ERROR: operator does not exist: jsonb ?? unknown
    • 适用于原始查询,例如DB::select("SELECT * FROM table_name WHERE jsonb_column ?? 'key'"),但我需要它与查询生成器一起使用。
  2. 使用命名函数/为运算符创建别名

    • '?' 转换为函数 - jsonb_exists(jsonb, text)
      • ->whereRaw("jsonb_exists(jsonb_column, 'key')")
    • CREATE OPERATOR @-> ( PROCEDURE = jsonb_exists, LEFTARG = jsonb, RIGHTARG = text );
      • ->whereRaw("jsonb_column @-> 'key'")
    • 这些解决方案都“有效”......但它们不使用索引

现在我正在研究CREATE OPERATOR CLASS …

php postgresql json laravel eloquent

0
推荐指数
1
解决办法
1760
查看次数