我在 PostgreSQL 9.4 中有这个表:
CREATE TABLE user_operations(
id SERIAL PRIMARY KEY,
operation_id integer,
user_id integer )
Run Code Online (Sandbox Code Playgroud)
该表由~1000-2000不同的操作组成,每个操作对应于所有用户80000-120000集合S的某个子集(每个子集由大约元素组成):
S = {1, 2, 3, ... , 122655}
Run Code Online (Sandbox Code Playgroud)
参数:
work_mem = 128MB
table_size = 880MB
Run Code Online (Sandbox Code Playgroud)
我也有一个关于operation_id.
问题:user_id对于operation_id集合的重要部分(20%-60%)查询所有不同的最佳计划是什么,例如:
SELECT DISTINCT user_id FROM user_operation WHERE operation_id < 500
Run Code Online (Sandbox Code Playgroud)
可以在表上创建更多索引。目前,查询的计划是:
HashAggregate (cost=196173.56..196347.14 rows=17358 width=4) (actual time=1227.408..1359.947 rows=598336 loops=1)
-> Bitmap Heap Scan on user_operation (cost=46392.24..189978.17 rows=2478155 width=4) (actual time=233.163..611.182 rows=2518122 loops=1)
Recheck Cond: …Run Code Online (Sandbox Code Playgroud) postgresql performance count distinct postgresql-performance
我们有一个 ERP 系统,它允许使用聚合(例如SUM(foo))但不允许使用 DISTINCT(例如SUM(DISTINCT foo).
是否可以创建一个聚合函数 ( SUM_DISTINCT),它返回与 相同的结果SUM(DISTINCT foo),所以SUM_DISTINCT(foo) = SUM(DISTINCT foo)?
我目前正在尝试在表中找到不同的组合,因为其中两列彼此之间存在多对多关系。
数据围绕着针对特定客户端运行的备份策略,可以总结如下:
我想为上表生成的答案是7,因为有很多不同的组合。
有没有人知道如何做到这一点?我曾尝试尝试使用嵌套计数和不同的值(我可以过滤到一列,但不能同时过滤两列)。
此问题与以下 2 个 SQL 错误有关(我添加的换行符)
MySql.Data.MySqlClient.MySqlException (0x80004005):
Expression #2 of ORDER BY clause is not in SELECT list, references column 'auitool2014.a.prog' which is not in SELECT list;
this is incompatible with DISTINCT
MySql.Data.MySqlClient.MySqlException (0x80004005):
Expression #2 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'H.C51' which is not functionally dependent on columns in GROUP BY clause;
this is incompatible with sql_mode=only_full_group_by
Run Code Online (Sandbox Code Playgroud)
我的问题很容易描述,即使没有发布原始 SQL。我有一个5.7.11-log在 Windows 上运行的 Mysql服务器,我可以SELECT A,B GROUP BY A并且SELECT …
我试图在删除重复条目的同时将数据从一个 PostgreSQL 9.3 表插入到另一个表。
我有两个包含电子邮件地址的表。
主表包含电子邮件和每个电子邮件地址的标签。组合(email, tag)必须是唯一的,为此有一个限制Unique(email, tag)。
第二个表是从仅包含电子邮件地址的文本文件中动态创建的。那里有很多重复。
我需要将临时表中的数据导入主表而不破坏上述约束。对于包含电子邮件地址的特定文件,标签是恒定的。
表结构:
CREATE TABLE emails (
email character varying(128),
tag bigint,
CONSTRAINT "unique-tag-email" UNIQUE (email, tag) )
Run Code Online (Sandbox Code Playgroud)
和
CREATE TABLE emails_temp (email character varying(128)
Run Code Online (Sandbox Code Playgroud)
这是我的查询:
insert into emails(tag,email)
select
655,t.email
from
emails_temp as t
where
not exists ( select email from emails where email = t.email )
Run Code Online (Sandbox Code Playgroud)
注意:655 只是某组电子邮件地址的标记。
这是我得到的错误:
错误:重复键值违反唯一约束“唯一标签电子邮件”SQL 状态:23505 详细信息:密钥(电子邮件,标签)=(user@hotmail.com,655)已经存在。
文件中确实有两个电子邮件地址 user@hotmail.com。
废话不多说,因为这个错误,主表(email)里什么都没有添加。
我究竟做错了什么?
我的 postgresql 列结构如下所示:
id | from | to
---------------
1 | A | B
2 | A | B
3 | C | D
Run Code Online (Sandbox Code Playgroud)
现在我想要一个看起来像这样的结果:
res
-----
'A:B'
'B:A'
'C:D'
'D:C'
Run Code Online (Sandbox Code Playgroud)
其中第一行和行从 A:B 排列到 B:A 和 'C:D' 到 'D:C',第二列由于不同的操作而被省略。
我看到以下同时使用 DISTINCT 和 GROUP BY 的 MySQL 查询:
SELECT DISTINCT user_id, post_id, post_content
FROM some_table
GROUP BY post_id, user_id
HAVING post_content LIKE '%abc%';
Run Code Online (Sandbox Code Playgroud)
这是一个与查询一起使用的场景:每个用户都有一个唯一的 id,user_id,并且可以发表多个由唯一 id 标识的帖子post_id。每个帖子都会包含一些文本。
我发现这令人困惑(来自 Oracle DB 之后)并有以下问题:
GROUP BY而不做任何聚合是什么意思?SELECTvs in中切换列的顺序有什么意义GROUP BY?GROUP BY?DISTINCT与 一起使用GROUP BY?在对最终结果或之前完成所有分组之后,是否运行不同的操作?考虑以下示例:
CREATE TABLE test (
id SERIAL,
some_integer INT
);
INSERT INTO test (some_integer)
SELECT FLOOR(RANDOM()*100000) from generate_series(1,100000) s(i);
CREATE INDEX some_integer_idx ON test (some_integer);
EXPLAIN ANALYZE SELECT COUNT(DISTINCT some_integer) from test;
Run Code Online (Sandbox Code Playgroud)
它返回以下查询计划:
CREATE TABLE test (
id SERIAL,
some_integer INT
);
INSERT INTO test (some_integer)
SELECT FLOOR(RANDOM()*100000) from generate_series(1,100000) s(i);
CREATE INDEX some_integer_idx ON test (some_integer);
EXPLAIN ANALYZE SELECT COUNT(DISTINCT some_integer) from test;
Run Code Online (Sandbox Code Playgroud)
我很惊讶它仍然在测试中进行顺序扫描。简单地计算索引中的行数不是更快吗?
如何将SELECT DISTINCT查询修改为UPDATE DISTINCT查询?
重要的是它只更新不同的记录,因为有多个记录与每个 [Finance_Project_Number] 相关联(由于 CRUD 操作)。我只想更新一条记录,因为这只会启动验证数据等的不同过程。
如果由于 DISTINCT 导致多条记录折叠为一行,则可以更新其中任何一条记录 - 没关系。
当我运行我的选择查询时,我得到的结果是:6 982:
SELECT DISTINCT
[Finance_Project_Number]
FROM [InterfaceInfor].[dbo].[ProjectMaster]
WHERE
NOT EXISTS
(
SELECT *
FROM [IMS].[dbo].[THEOPTION]
WHERE
[InterfaceInfor].[dbo].[ProjectMaster].[Finance_Project_Number] =
[IMS].[dbo].[THEOPTION].[NAME]
);
Run Code Online (Sandbox Code Playgroud)
这是我将查询转换为查询的尝试DISTINCT UPDATE,但这会更新 15 353 条记录:
UPDATE [InterfaceInfor].[dbo].[ProjectMaster]
SET
[Processing_Result_Text] = 'UNIQUE',
[Processing_Result] = 0
WHERE
NOT EXISTS
(
SELECT *
FROM [IMS].[dbo].[THEOPTION]
WHERE
[InterfaceInfor].[dbo].[ProjectMaster].[Finance_Project_Number] =
[IMS].[dbo].[THEOPTION].[NAME]
);
Run Code Online (Sandbox Code Playgroud) 我有一个us_customers看起来像这样的表(有数十万行):
+----------+----------+
| id | us_state |
+----------+----------+
| 12345678 | MA |
| 23456781 | AL |
| 34567812 | GA |
| 45678123 | FL |
| 56781234 | AZ |
| 67812345 | MA |
| 78123456 | CO |
| 81234567 | FL |
+----------+----------+
Run Code Online (Sandbox Code Playgroud)
...我想n从每个us_state.
有没有办法在 PostgreSQL 9.3 中干净利落地做到这一点?
我可以通过以下方式us_state轻松地从每个客户那里获得一位客户:
SELECT DISTINCT ON (us_state) id
FROM us_customers
ORDER BY us_state;
Run Code Online (Sandbox Code Playgroud)
但是,如果我想要来自每个州的三个客户,有没有一种方法可以在不多次运行相同查询的情况下做到这一点?
distinct ×10
postgresql ×6
count ×3
mysql ×3
aggregate ×2
group-by ×2
constraint ×1
index ×1
mysql-5.1 ×1
mysql-5.7 ×1
oracle ×1
performance ×1
sql-server ×1
syntax ×1
update ×1