我正在尝试将一些旧的MySQL查询移植到PostgreSQL,但我遇到了这个问题:
DELETE FROM logtable ORDER BY timestamp LIMIT 10;
Run Code Online (Sandbox Code Playgroud)
PostgreSQL不允许对其删除语法进行排序或限制,并且该表没有主键,因此我无法使用子查询.此外,我想保留在查询删除的行为究竟该规定数量的记录-例如,如果表中包含30行,但它们都具有相同的时间戳,我还是想删除10,虽然它并不重要哪10.
所以; 如何在PostgreSQL中通过排序删除固定数量的行?
编辑:没有主键意味着没有log_id列或类似.啊,遗留系统的乐趣!
我在PostgreSQL 8.3.8数据库中有一个表,它没有键/约束,并且有多行具有完全相同的值.
我想删除所有重复项,每行只保留1份.
特别是有一列(称为"密钥")可用于识别重复(即每个不同的"密钥"应该只存在一个条目).
我怎样才能做到这一点?(理想情况下使用单个SQL命令)在这种情况下,速度不是问题(只有几行).
我们有一张包含以下列的照片表:
id, merchant_id, url
Run Code Online (Sandbox Code Playgroud)
此表包含组合的重复值merchant_id, url.所以有一行可能会出现多次.
234 some_merchant http://www.some-image-url.com/abscde1213
235 some_merchant http://www.some-image-url.com/abscde1213
236 some_merchant http://www.some-image-url.com/abscde1213
Run Code Online (Sandbox Code Playgroud)
删除这些重复的最佳方法是什么?(我使用PostgreSQL 9.2和Rails 3.)
我正在使用Postgres,并希望进行一个从CSV文件中获取的大更新查询,假设我得到了一张表(id, banana, apple).
我想运行一个更新香蕉而不是苹果的更新,每个新香蕉及其ID都将在CSV文件中.
我试着查看Postgres网站,但是这些例子正在扼杀我.
在将记录合并为一个时,删除重复项的最佳方法是什么?
我有一种情况,表跟踪播放器名称和他们的记录,如下所示:
stats
-------------------------------
nick totalgames wins ...
John 100 40
john 200 97
Whistle 50 47
wHiStLe 75 72
...
Run Code Online (Sandbox Code Playgroud)
我需要合并缺口重复的行(当忽略大小写时)并将记录合并为一个,如下所示:
stats
-------------------------------
nick totalgames wins ...
john 300 137
whistle 125 119
...
Run Code Online (Sandbox Code Playgroud)
我在Postgres做这个.最好的方法是什么?
我知道通过这样做,我可以获得存在重复项的名称:
select lower(nick) as nick, totalgames, count(*)
from stats
group by lower(nick), totalgames
having count(*) > 1;
Run Code Online (Sandbox Code Playgroud)
我想到了这样的事情:
update stats
set totalgames = totalgames + s.totalgames
from (that query up there) s
where lower(nick) = s.nick
Run Code Online (Sandbox Code Playgroud)
除此之外不能正常工作.我似乎仍然无法删除包含重复名称的其他重复行.我能做什么?有什么建议?
如何在Postgres 9表中删除重复行,每个字段上的行完全重复,并且没有单独的字段可以用作唯一键,所以我不能只GROUP BY使用列并使用NOT IN语句.
我正在寻找一个单独的SQL语句,而不是一个需要我创建临时表并将记录插入其中的解决方案.我知道如何做到这一点,但需要更多的工作来适应我的自动化过程.
表定义:
jthinksearch=> \d releases_labels;
Unlogged table "discogs.releases_labels"
Column | Type | Modifiers
------------+---------+-----------
label | text |
release_id | integer |
catno | text |
Indexes:
"releases_labels_catno_idx" btree (catno)
"releases_labels_name_idx" btree (label)
Foreign-key constraints:
"foreign_did" FOREIGN KEY (release_id) REFERENCES release(id)
Run Code Online (Sandbox Code Playgroud)
样本数据:
jthinksearch=> select * from releases_labels where release_id=6155;
label | release_id | catno
--------------+------------+------------
Warp Records | 6155 | WAP 39 CDR
Warp Records | 6155 | WAP 39 CDR
Run Code Online (Sandbox Code Playgroud) 我有一个postgres数据库作为应用程序的一部分,当前文本字段填充了大约300K的文本.
表中大约有3列可以常规填充这些信息.这导致表格超过一个大约100行的演出.我想删除那些列中的数据而不删除行中的其他信息 - 我的问题是,如果我做更新集columns =''比插入select更好,我只是选择了我需要的行,然后删除现有的行.它是第三方应用程序,因此此时无法重写它们存储数据的方式.
像这里一样,我有一个大表,用于存储我们系统中的所有事件,对于一种事件类型,我有重复的行(多次错误地从另一个系统导出)。我需要删除它们以清除统计数据。上面提出的解决方案是
但在我的情况下,我只需要删除一类事件,而不是所有行,这对于truncate. 我想知道我是否可以从 postgres USING 语法中受益,就像这个SO 答案一样,它提供了以下解决方案 -
DELETE FROM user_accounts
USING user_accounts ua2
WHERE user_accounts.email = ua2.email AND user_account.id < ua2.id;
Run Code Online (Sandbox Code Playgroud)
问题是我在这个大表中没有 id 字段。那么在这种情况下最快的决定是什么?从临时表中删除+插入是唯一的选择吗?
我有一个包含 3 列(id、金额、时间)的表。该表根据id升序排列。我想删除除第一个之外在金额列中具有相同值的所有连续行。
例如:
id: 12,15,16,17,19,22
amount: 555,546,546,53,53,500
time:
Run Code Online (Sandbox Code Playgroud)
回答:
id:12,15,17,22 amount: 555,546,53,500 time:
Run Code Online (Sandbox Code Playgroud)
只要连续行在金额列中具有相同的值,连续行的时间列就相同。我在 SO 上搜索但找不到类似的问题