我需要检索表中的所有行,其中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)
但是我的大脑比那更远了.
我的表中有重复的行,我想以最有效的方式删除重复项,因为表很大.经过一番研究,我得出了这个问题:
WITH TempEmp AS
(
SELECT name, ROW_NUMBER() OVER(PARTITION by name, address, zipcode ORDER BY name) AS duplicateRecCount
FROM mytable
)
-- Now Delete Duplicate Records
DELETE FROM TempEmp
WHERE duplicateRecCount > 1;
Run Code Online (Sandbox Code Playgroud)
但它只适用于SQL,而不适用于Netezza.它似乎不喜欢DELETE后面的WITH条款?
使用Postgres,我试图AUTO_INCREMENT在SQL中自动编号我的主键.但是,它给了我一个错误.
CREATE TABLE Staff (
ID INTEGER NOT NULL AUTO_INCREMENT,
Name VARCHAR(40) NOT NULL,
PRIMARY KEY (ID)
);
Run Code Online (Sandbox Code Playgroud)
错误:
Run Code Online (Sandbox Code Playgroud)********** Error ********** ERROR: syntax error at or near "AUTO_INCREMENT" SQL state: 42601 Character: 63
知道为什么吗?
假设我有一个表,我想使用serial主键来请求客户端的更改.客户将询问"在密钥X后给我更改".不使用SERIALIZABLE隔离级别或锁定,这很容易出现竞争条件.
事务A可以先启动,然后执行写操作,然后花费很长时间来提交.同时事务B将在A提交之前启动并提交.来自B的写入将获得比来自A的写入更高的主键.如果客户端现在要求更改,则它将错过来自A的仍然未提交的写入,并记下最新的最高主键.因此,即使在A提交之后,客户端也永远不会看到该更改,因为它的密钥低于客户端已经获得的更改.
是否有可能serial在提交时以原子方式确定a (或来自计数器的类似值),以便保证在提交时它将高于所有其他值,并且低于在其之后提交的所有值?如果不是解决这个问题的最佳方法是什么?
这是代码:
CREATE TABLE audit_trail (
old_email TEXT NOT NULL,
new_email TEXT NOT NULL
);
INSERT INTO audit_trail(old_email, new_email)
VALUES ('harold_gim@yahoo.com', 'hgimenez@hotmail.com'),
('hgimenez@hotmail.com', 'harold.gimenez@gmail.com'),
('harold.gimenez@gmail.com', 'harold@heroku.com'),
('foo@bar.com', 'bar@baz.com'),
('bar@baz.com', 'barbaz@gmail.com');
WITH RECURSIVE all_emails AS (
SELECT old_email, new_email
FROM audit_trail
WHERE old_email = 'harold_gim@yahoo.com'
UNION
SELECT at.old_email, at.new_email
FROM audit_trail at
JOIN all_emails a
ON (at.old_email = a.new_email)
)
SELECT * FROM all_emails;
old_email | new_email
--------------------------+--------------------------
harold_gim@yahoo.com | hgimenez@hotmail.com
hgimenez@hotmail.com | harold.gimenez@gmail.com
harold.gimenez@gmail.com | harold@heroku.com
(3 rows)
select old_email, new_email …Run Code Online (Sandbox Code Playgroud) 我的团队需要一个串行列来随着每次提交单调增加.
有些情况下,两笔交易获得值的情况下100,并101从序列,那么100交易需要更长的时间来提交,所以价值101首先得到承诺,其次是100.这种情况对我们的需求是有问题的,我们需要解决它.
这正是这个问题所描述的问题.我们需要一个不需要更改数据库配置的解决方案,这与该问题的已接受答案不同.
对该解决方案的评论以及本文建议使用在获取值之前开始的独占事务咨询锁.
有没有办法让Postgres自动获取此锁并在序列到达INSERT相关表时从序列中获取值?
注意:提交的值中的间隙是可以预期的.
编辑:我已经深入研究这个问题,能够很好地问它,但我对Postgres不是很有经验.我希望指向特定触发器的指针或任何特定的PG设置将实现此目的.
如何在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) 我有一个简单的SQL表,看起来像这样-
CREATE TABLE msg (
from_person character varying(10),
from_location character varying(10),
to_person character varying(10),
to_location character varying(10),
msglength integer,
ts timestamp without time zone
);
Run Code Online (Sandbox Code Playgroud)
我想为表中的每一行找出过去3分钟内是否有不同的“ from_person”和“ from_location”与当前行中的“ to_person”进行了交互。
例如,在上表中,对于第4行,除了孟买的mary(当前行)之外,纽约市的nancy和巴塞罗那的bob也在最近3分钟内向charlie发送了一条消息,因此计数为2。
同样,对于第2行,除了巴塞罗那(当前行)的bob以外,只有纽约市的nancy向ca(当前行)的查理发送了一条消息,因此计数为1
示例所需的输出-
0
1
0
2
Run Code Online (Sandbox Code Playgroud)
我尝试使用窗口函数,但似乎在frame子句中我可以指定前后的行数,但不能指定时间本身。
示例数据:
test,test2
----------
a,qwer
b,wert
c,erty
d,rtuy
d,tyui
e,yuio
e,uiop
Run Code Online (Sandbox Code Playgroud)
我正在尝试编写一个返回表中唯一值的查询:
SELECT
test
FROM aatest
GROUP BY test
HAVING (COUNT(test) = 1)
Run Code Online (Sandbox Code Playgroud)
这有效并返回 a、b 和 c,因为 d 和 e 不是唯一的。
但我也想打印出 test2 所以我试过:
select
test,
test2
from aatest
GROUP BY test
HAVING (COUNT(test) = 1)
Run Code Online (Sandbox Code Playgroud)
但我得到了错误。
我想在Postgres中运行一个SQL查询,它与你在没有order by子句的情况下运行初始查询所获得的完全相反.
因此,如果您的查询是:
SELECT * FROM users
Run Code Online (Sandbox Code Playgroud)
然后
SELECT * FROM users ORDER BY <something here to make it exactly the reverse of before>
Run Code Online (Sandbox Code Playgroud)
它会这样吗?
ORDER BY Desc
Run Code Online (Sandbox Code Playgroud) postgresql ×10
sql ×9
duplicates ×3
sql-order-by ×2
transactions ×2
commit ×1
database ×1
distinct ×1
locking ×1
netezza ×1
sql-update ×1
types ×1
union ×1