我在匹配表中有以下数据:
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) 我正在努力解决这个问题,我环顾四周,但所有类似的问题都比我的更先进,利用日志,它比我们在课堂上做的更先进.这是问题:
Suppose you have a 4-way set associative cache which has in total
4096 bytes of cache memory and each cache line is 128 bytes. How many
sets are there is this cache? If memory is byte addressable and addresses
are 16 bits then how many bytes are used for the tag?
这是我到目前为止所拥有的:
4096/128 = num lines
4096/128/4 = 8 = num sets (each set is 4 lines in 4-way set assoiative)
So, need 3 bits to choose set (2^3=8) …
我想在我的表上为start_time创建一个索引,这是我的 json 列中名为match的 timestamptz (带时区的时间戳)字段。
在这个问题和这篇文章之后,我了解到由于不同的时区和本地化,您无法在 timestamptz 字段上创建索引。这两个都表明您可以在时间戳(转换为文本)上创建索引,因此我尝试了以下功能:
CREATE OR REPLACE FUNCTION to_text(timestamptz)
RETURNS text AS $$
SELECT to_char($1 at time zone 'UTC', 'YYYY-MM-DD"T"HH24:MI:SS.US')
$$
LANGUAGE sql IMMUTABLE;
Run Code Online (Sandbox Code Playgroud)
我相信这与时区和本地化没有问题。
CREATE INDEX i_match_start_time ON matches (to_text(((match->>'start_time')::timestamptz)));
Run Code Online (Sandbox Code Playgroud)
这将返回以下内容:
错误:索引表达式中的函数必须标记为 IMMUTABLE
我还尝试过返回时间戳的函数:
SELECT ($1 at time zone 'UTC')
Run Code Online (Sandbox Code Playgroud)
以及返回 unix 时间的函数(尝试了 double 并转换为十进制):
SELECT EXTRACT(EPOCH FROM $1)
Run Code Online (Sandbox Code Playgroud)
其中每个都返回相同的错误。
我需要在start_time上建立索引,因为实际上对该表的所有选择查询都将按start_time排序。
我正在运行以下查询:
WITH match_team_vals(match_id, team_id, is_radiant) AS (
VALUES
(2281450916, 2783913, true),
(2281450916, 2538753, false)
)
INSERT INTO dota_match_team(match_id, team_id, is_radiant)
SELECT match_id, team_id, is_radiant
FROM match_team_vals
RETURNING id AS lineup_id
Run Code Online (Sandbox Code Playgroud)
在这张桌子上:
CREATE TABLE dota_match_team
(
id serial NOT NULL,
match_id integer NOT NULL,
team_id integer,
is_radiant boolean NOT NULL,
CONSTRAINT dota_match_teams_pkey PRIMARY KEY (id)
)
Run Code Online (Sandbox Code Playgroud)
我得到的错误信息是
ERROR: integer out of range
SQL state: 22003
Run Code Online (Sandbox Code Playgroud)
我已经尝试将match_id和team_id强制转换为bigint.同时在线查看我看到人们在串口达到整数上限时遇到了这个问题.似乎并非如此:
SELECT nextval('dota_match_team_id_seq')
returns 31
Run Code Online (Sandbox Code Playgroud) 我在匹配表中有以下数据:
{"Id":1,"Teams":[{"Name":"TeamA","Players":[{"Name":"AAA"},{"Name":"BBB"}]},{"Name":"TeamB","Players":[{"Name":"CCC"},{"Name":"DDD"}]}],"TeamRank":[1,2]}
{"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)
最终,我想获得一份独特的团队名单.
以下问题我一直在尝试使用以下方法访问Team Name属性:
SELECT json_array_elements(match->>'Teams') FROM matches
Run Code Online (Sandbox Code Playgroud)
这回来了
ERROR: function json_array_elements(text) does not exist
SQL state: 42883
Hint: No function matches the given name and argument types. You might need to add explicit type casts.
Character: 1560
Run Code Online (Sandbox Code Playgroud)
我也试过json_array_elements(match - >>'Teams':: json)和json_array_elements(to_json(match - >>'Teams'))无济于事.
但是以下查询
SELECT match->>'Teams' FROM matches;
Run Code Online (Sandbox Code Playgroud)
返回
"[{"Name":"TeamA","Players":[{"Name":"AAA"},{"Name":"BBB"}]},{"Name":"TeamB","Players":[{"Name":"CCC"},{"Name":"DDD"}]}]"
"[{"Name":"TeamA","Players":[{"Name":"CCC"},{"Name":"BBB"}]},{"Name":"TeamB","Players":[{"Name":"AAA"},{"Name":"DDD"}]}]"
Run Code Online (Sandbox Code Playgroud)