正如标题所示,我想选择用a组成的每组行的第一行GROUP BY.
具体来说,如果我有一个purchases看起来像这样的表:
SELECT * FROM purchases;
Run Code Online (Sandbox Code Playgroud)
我的输出:
id | customer | total ---+----------+------ 1 | Joe | 5 2 | Sally | 3 3 | Joe | 2 4 | Sally | 1
我想查询每个产品id的最大购买量(total)customer.像这样的东西:
SELECT FIRST(id), customer, FIRST(total)
FROM purchases
GROUP BY customer
ORDER BY total DESC;
Run Code Online (Sandbox Code Playgroud)
预期产出:
FIRST(id) | customer | FIRST(total)
----------+----------+-------------
1 | Joe | 5
2 | Sally | 3
我需要检索表中的所有行,其中2列组合都是不同的.因此,我希望所有在同一天没有任何其他销售的销售以相同的价格出售.基于日期和价格的唯一销售将更新为活动状态.
所以我在想:
UPDATE sales
SET status = 'ACTIVE'
WHERE id IN (SELECT DISTINCT (saleprice, saledate), id, count(id)
FROM sales
HAVING count = 1)
Run Code Online (Sandbox Code Playgroud)
但是我的大脑比那更远了.
我在PostgreSQL 8.3.8数据库中有一个表,它没有键/约束,并且有多行具有完全相同的值.
我想删除所有重复项,每行只保留1份.
特别是有一列(称为"密钥")可用于识别重复(即每个不同的"密钥"应该只存在一个条目).
我怎样才能做到这一点?(理想情况下使用单个SQL命令)在这种情况下,速度不是问题(只有几行).
有没有办法为表记录生成某种有序标识符?
假设我们有两个线程在进行查询:
线程1:
begin;
insert into table1(id, value) values (nextval('table1_seq'), 'hello');
commit;
Run Code Online (Sandbox Code Playgroud)
线程2:
begin;
insert into table1(id, value) values (nextval('table1_seq'), 'world');
commit;
Run Code Online (Sandbox Code Playgroud)
完全可能(取决于时间)外部观察者会看到(2,'世界')记录出现在(1,'你好')之前.
这很好,但是我想要一种方法来获取自上次外部观察者检查它以来出现的'table1'中的所有记录.
那么,有没有办法按照插入的顺序获取记录?也许OID可以提供帮助?
我有一个范围来限制所有questions用户是否投票.在模型中:
scope :answered_by, lambda {|u| joins(:votes).where("votes.user_id = ?", u.id) }
scope :unanswered_by, lambda {|u| joins(:votes).where("votes.user_id != ?", u.id) }
Run Code Online (Sandbox Code Playgroud)
在控制器中,我这样称呼它们:
@answered = Question.answered_by(current_user)
@unanswered = Question.unanswered_by(current_user)
Run Code Online (Sandbox Code Playgroud)
unanswered_by范围不正确.我基本上想找到没有投票的地方.相反,它试图寻找是否存在与当前用户不相等的投票.任何想法如何返回不存在连接的所有记录?
我正在研究postgres查询以从表中删除重复项.下表是动态生成的,我想编写一个select查询,如果第一行有重复值,它将删除记录.
该表看起来像这样
Ist col 2nd col
4 62
6 34
5 26
5 12
Run Code Online (Sandbox Code Playgroud)
我想写一个select查询,删除第3行或第4行.
我有一个表有很多重复的行并且没有主键。
我只想删除重复的记录,但是当我尝试这样做时,它会删除所有对等点。
如何ROWID从 Postgres 的表中找到?
我读过以前的问题,但它们与我的不相似(例如,我没有唯一的标识符).
说这是我的表行:
id string x y z time_x
10318 'hello' 33700 5053 8 2015-07-03 12:39:49.61408
14071 'hello' 33700 5053 8 2015-07-03 12:39:49.61408
Run Code Online (Sandbox Code Playgroud)
基本上一切都是相同的,除了行的id.如何识别这些情况并删除冗余行?
注意:并非表中的所有行都是重复的.应保留常规行.
我在删除重复行时遇到了一些困难。我认为 user_id 和 time_id 一起充当标识符,但它们甚至是重复的。
user_id(文本)、time_id(bigint)、value1(数字)
user_id; time_id; value1|
aaa;1;3|
aaa;1;3|
aaa;2;4|
baa;3;1|
Run Code Online (Sandbox Code Playgroud)
在这种情况下,如何删除重复项?因为我在 time_id 中有 16 个不同的值,在 user_id 中有 15,000 个不同的值,所以我尝试了这样的事情,但我没有唯一的 id..
DELETE FROM tablename a
USING tablename b
WHERE a.unique_id < b.unique_id
AND a.user_id = b.user_id
time_id = 1 (repeat till time_id 16)
Run Code Online (Sandbox Code Playgroud) postgresql ×9
sql ×6
duplicates ×3
database ×1
distinct ×1
group-by ×1
rowid ×1
sequence ×1
sql-update ×1
sqlite ×1