我有一张看起来像这个来电者'makerar'的桌子
cname | wmname | avg
--------+-------------+------------------------
canada | zoro | 2.0000000000000000
spain | luffy | 1.00000000000000000000
spain | usopp | 5.0000000000000000
Run Code Online (Sandbox Code Playgroud)
我想为每个cname选择最大平均值.
SELECT cname, wmname, MAX(avg) FROM makerar GROUP BY cname;
Run Code Online (Sandbox Code Playgroud)
但我会收到一个错误,
ERROR: column "makerar.wmname" must appear in the GROUP BY clause or be used in an aggregate function
LINE 1: SELECT cname, wmname, MAX(avg) FROM makerar GROUP BY cname;
Run Code Online (Sandbox Code Playgroud)
所以我这样做
SELECT cname, wmname, MAX(avg) FROM makerar GROUP BY cname, wmname;
Run Code Online (Sandbox Code Playgroud)
但这不会给出意图的结果,并显示下面的错误输出.
cname | wmname | max
--------+--------+------------------------
canada …Run Code Online (Sandbox Code Playgroud) 我在匹配表中有以下数据:
5;{"Id":1,"Teams":[{"Name":"TeamA","Players":[{"Name":"AAA"},{"Name":"BBB"}]},{"Name":"TeamB","Players":[{"Name":"CCC"},{"Name":"DDD"}]}],"TeamRank":[1,2]}
6;{"Id":2,"Teams":[{"Name":"TeamA","Players":[{"Name":"CCC"},{"Name":"BBB"}]},{"Name":"TeamB","Players":[{"Name":"AAA"},{"Name":"DDD"}]}],"TeamRank":[1,2]}
Run Code Online (Sandbox Code Playgroud)
我想按名称选择表格中每个最后一个不同的团队.即我想要一个将返回的查询:
6;{"Name":"TeamA","Players":[{"Name":"CCC"},{"Name":"BBB"}
6;{"Name":"TeamB","Players":[{"Name":"AAA"},{"Name":"DDD"}
Run Code Online (Sandbox Code Playgroud)
所以每个团队从上次那个团队出现在表中.
我一直在使用以下(从这里):
WITH t AS (SELECT id, json_array_elements(match->'Teams') AS team FROM matches)
SELECT MAX(id) AS max_id, team FROM t GROUP BY team->'Name';
Run Code Online (Sandbox Code Playgroud)
但这回归:
Run Code Online (Sandbox Code Playgroud)ERROR: could not identify an equality operator for type json SQL state: 42883 Character: 1680
我知道Postgres 没有JSON的相等性.我只需要团队名称(字符串)的相等性,该团队中的队员不需要进行比较.
任何人都可以建议另一种方法吗?
以供参考:
SELECT id, json_array_elements(match->'Teams') AS team FROM matches
Run Code Online (Sandbox Code Playgroud)
收益:
5;"{"Name":"TeamA","Players":[{"Name":"AAA"},{"Name":"BBB"}]}"
5;"{"Name":"TeamB","Players":[{"Name":"CCC"},{"Name":"DDD"}]}"
6;"{"Name":"TeamA","Players":[{"Name":"CCC"},{"Name":"BBB"}]}"
6;"{"Name":"TeamB","Players":[{"Name":"AAA"},{"Name":"DDD"}]}"
Run Code Online (Sandbox Code Playgroud)
编辑:我转向text并关注这个问题,我用DISTINCT ON而不是GROUP BY.这是我的完整查询:
WITH t AS (SELECT id, …Run Code Online (Sandbox Code Playgroud) 尝试使用PostgreSQL检索按日期分组的ActiveRecord对象数组.
更具体地说,我正在尝试翻译以下MySQL查询:
@posts = Post.all(:group => "date(date)",
:conditions => ["location_id = ? and published = ?", @location.id, true],
:order => "created_at DESC")
Run Code Online (Sandbox Code Playgroud)
我知道PostgreSQL对SQL标准的解释比MySQL更严格,因此这种类型的查询不起作用......并且已经阅读了StackOverflow和其他主题上的一些帖子 - 但它们似乎都没有关于这个问题的明确答案
我已经尝试过各种各样的查询组合,分组和不同的条款没有太大的乐趣 - 目前我有一个相当不优雅的黑客,虽然作品让我脸红时看着它.
使用Rails和PostgreSQL进行此类查询的正确方法是什么?(忽略肯定这应该在ActiveRecord级别抽象出来的事实)
postgresql ×3
sql ×2
activerecord ×1
django ×1
group-by ×1
json ×1
lateral ×1
sqlite ×1
testing ×1