假设我们有一个包含四列(a,b,c,d)相同数据类型的表。
是否可以选择列中数据中的所有不同值并将它们作为单个列返回,或者我是否必须创建一个函数来实现这一点?
postgresql performance postgresql-9.4 distinct postgresql-performance
谁能解释下面的情况,其中两个看似相等的值没有减少DISTINCT?
上面的查询是SELECT DISTINCT name FROM master.sys.dm_os_spinlock_stats where name = 'SBS_UCS_DISPATCH';
等效方法SELECT name FROM master.sys.dm_os_spinlock_stats where name = 'SBS_UCS_DISPATCH' GROUP BY name;也执行相同的操作,并且添加HAVING COUNT(1) > 1不会产生行。
@@VERSION是Microsoft SQL Server 2019 (RTM-CU13) (KB5005679) - 15.0.4178.1 (X64) 2021 年 9 月 23 日 16:47:49 版权所有 (C) 2019 Microsoft Corporation 企业版:Windows Server 上基于核心的许可(64 位) 2016 标准 10.0(内部版本 14393:)
我想根据具有其他 3 列的唯一组合的重复行,仅获取列(列名 DEF)中具有不同值的行。
示例:在下面的示例中,前两行的前 3 列具有相同的值。但它们的列 DEF 具有不同的值。所以这两行都列在输出中。
但是第 2 行和第 4 行的前 3 列具有唯一组合,但它们在 DEF 列中具有相同的值。因此不会在输出中列出。
不会列出第 5 行和第 6 行,因为它们是具有不同值的单行。
+----------+-------+--------+--------+
| dept | role1 |role2 |DEF |
+----------+-------+--------+--------+
| a | abc | er | 0 |
| a | abc | er | 1 |
| b | qwer | ty | 0 |
| b | qwer | ty | 0 |
| c | der | ui | 1 |
| d | …Run Code Online (Sandbox Code Playgroud) 下面是我的会员表的一个例子。在电子邮件字段中有一些记录具有多个值。我只想选择那些具有多个电子邮件值的记录:
ID LASTNAME FIRSTNAME EMAIL
567 Jones Carol carolj@gmail.com
567 Jones Carol caroljones@aol.com
678 Black Ted tedblack@gmail.com
908 Roberts Cole coleroberts@gmail.com
908 Roberts Cole coler@aol.com
908 Roberts Cole colerobersc@hotmail.com
Run Code Online (Sandbox Code Playgroud)
我希望结果是:
567 Jones Carol carolj@gmail.com
567 Jones Carol caroljones@aol.com
908 Roberts Cole coleroberts@gmail.com
908 Roberts Cole coler@aol.com
908 Roberts Cole colerobersc@hotmail.com
Run Code Online (Sandbox Code Playgroud)
请注意,缺少 Ted Black,因为他只有一个电子邮件地址条目。
我应该澄清一下,我的会员表有 4 列以上。电话和地址等还有额外的列。一个成员可能有多个条目,因为他/她有多个电话号码或地址。我只想捕获那些拥有多个电子邮件地址的人。
这是数据库清理的一部分,将添加主键。我应该进一步澄清,有些人可能有多个具有相同电子邮件地址的条目。在此阶段,我不想捕获具有相同电子邮件地址的多个条目,而只想捕获具有不同电子邮件地址的多个条目的那些条目。
你如何查询三个最大的唯一客户Purchase_Cost?
我想应用DISTINCT唯一的 on Customer_Name,但下面的查询在所有三列上应用不同的。我应该如何修改查询以获得所需的输出?
SELECT DISTINCT TOP 3 customer_name, order_no, Purchase_Cost
FROM PurchaseTable
ORDER BY Purchase_Cost
Run Code Online (Sandbox Code Playgroud)
这个问题的一个例子表明,SQL Server 将选择全索引扫描来解决这样的查询:
select distinct [typeName] from [types]
Run Code Online (Sandbox Code Playgroud)
其中 [typeName] 有一个非聚集的、非唯一的升序索引。他的示例有 200M 行,但只有 76 个唯一值。在这种密度下,搜索计划似乎是更好的选择(约 76 次二进制搜索)?
他的情况可以正常化,但问题的原因是我真的想解决这样的问题:
select TransactionId, max(CreatedUtc)
from TxLog
group by TransactionId
Run Code Online (Sandbox Code Playgroud)
上有一个索引(TransactionId, MaxCreatedUtc)。
使用标准化源 (dt) 重写不会改变计划。
select dt.TransactionId, MaxCreatedUtc
from [Transaction] dt -- distinct transactions
cross apply
(
select Max(CreatedUtc) as MaxCreatedUtc
from TxLog tl
where tl.TransactionId = dt.TransactionId
) ca
Run Code Online (Sandbox Code Playgroud)
仅将 CA 子查询作为标量 UDF 运行确实显示了 1 次搜索的计划。
select max(CreatedUtc) as MaxCreatedUtc
from Pub.TransactionLog
where TransactionID = @TxId;
Run Code Online (Sandbox Code Playgroud)
在原始查询中使用该标量 UDF 似乎可行,但会失去并行性(UDF 的已知问题): …
我正在使用 MS Access 2013 中的食品采购/发票系统,并尝试创建一个 SQL 查询,该查询将返回每个单独食品的最新购买价格。
我对 SQL 的理解是非常基本的,我尝试了以下(不正确的)查询,希望它只返回每个项目的一条记录(因为DISTINCT运算符)并且它只会返回最近购买的(因为我做了ORDER BY [Invoice Date] DESC)
SELECT DISTINCT ([Food items].Item),
[Food items].Item, [Food purchase data].[Price per unit], [Food purchase data].[Purchase unit], Invoices.[Invoice Date]
FROM Invoices
INNER JOIN ([Food items]
INNER JOIN [Food purchase data]
ON [Food items].ID = [Food purchase data].[Food item ID])
ON Invoices.ID = [Food purchase data].[Invoice ID]
ORDER BY Invoices.[Invoice Date] DESC;
Run Code Online (Sandbox Code Playgroud)
然而,上面的查询只是返回所有的食品购买(即 中每个记录的多条记录[Food items]),结果按日期降序排序。有人可以向我解释我对DISTINCT运营商的误解吗?也就是说,为什么它不只为 中的每个项目返回一条记录[Food items]?
更重要的是 …
请考虑下表test:
CREATE TABLE test(col1 int, col2 varchar, col3 date);
INSERT INTO test VALUES
(1,'abc','2015-09-10')
, (1,'abc','2015-09-11')
, (2,'xyz','2015-09-12')
, (2,'xyz','2015-09-13')
, (3,'tcs','2015-01-15')
, (3,'tcs','2015-01-18');
Run Code Online (Sandbox Code Playgroud)
postgres=# select * from test;
col1 | col2 | col3
------+------+------------
1 | abc | 2015-09-10
1 | abc | 2015-09-11
2 | xyz | 2015-09-12
2 | xyz | 2015-09-13
3 | tcs | 2015-01-15
3 | tcs | 2015-01-18
Run Code Online (Sandbox Code Playgroud)
我想要一个按日期 desc 排序的返回集合:
col1 | col2 | col3
------+------+------------
2 | xyz | …Run Code Online (Sandbox Code Playgroud) postgresql order-by greatest-n-per-group distinct postgresql-9.6
我正在使用 PostgreSQL 9.4。
我有一个包含以下条目的表:
id | postcode | date_created
---+----------+-----------------
14 | al2 2qp | 2015-09-23 14:46:57
14 | al2 2qp | 2015-09-23 14:51:07
14 | sp2 8ag | 2015-09-23 14:56:11
14 | se4 | 2015-09-23 16:12:05
17 | e2 | 2015-09-23 16:15:35
17 | fk20 8ru | 2015-09-23 16:28:35
17 | fk20 8ru | 2015-09-23 16:35:51
17 | se2 | 2015-09-23 16:36:17
17 | fk20 8ru | 2015-09-23 16:36:22
17 | fk20 8ru | 2015-09-23 16:37:04
17 | se1 …Run Code Online (Sandbox Code Playgroud) 我试图从表中返回一组不同的部门名称 - 没什么特别的。但是,使用以下查询时会显示重复项:
select distinct department_name
from dbo.departments;
Run Code Online (Sandbox Code Playgroud)
我也试过:
select distinct department_name
from dbo.departments
group by department_name;
Run Code Online (Sandbox Code Playgroud)
所以这让我相信我可能在值中隐藏了字符,果然,当我检查字符串的长度时,它们返回了不同的值。所以,我决定使用堆栈溢出这个问题中的函数来定位隐藏字符。奇怪的是,这只返回 SPACE。然后我尝试了以下查询,它根本没有区别:
select distinct ltrim(rtrim(department_name)) as department_name
from dbo.departments;
Run Code Online (Sandbox Code Playgroud)
出于好奇,我将这些值转换为VARBINARY并注意到它们具有完全相同的二进制值,并且对二进制值执行 aDISTINCT确实会产生一个唯一的结果集。
我也尝试在VARCHAR和NVARCHAR和到不同的排序规则之间进行转换(值在同一列中,在使用 Latin1_General_CI_AI 的同一数据库中)。我真的需要能够从这张表中得到一个不同的集合。有谁知道可能导致这个问题的原因是什么?
更新
经过进一步调查,这个问题似乎只发生在以十六进制值结尾的字符串中0xA000。列中不以该字符结尾的任何值都可以。
更新 2
如果我0xA000从字符串中删除字符,我可以DISTINCT像这样正常应用:
DECLARE @binary VARBINARY(8) = 0xA000;
DECLARE @string VARCHAR(8) = CONVERT(VARCHAR(MAX), @binary);
UPDATE dbo.departments
SET department_name = REPLACE(department_name, @string, '');
Run Code Online (Sandbox Code Playgroud)
但这不会长期有效,因为用户可以更新此表,我需要调整每个查询以在WHERE子句中进行替换。我现在正在使用一种解决方法,它只不过是MIN用于返回长度最短的条目。这不太理想,因为 distinct 的问题也会影响大多数其他语言元素,例如GROUP BY …
distinct ×10
sql-server ×5
postgresql ×3
collation ×1
count ×1
date ×1
group-by ×1
index ×1
join ×1
ms-access ×1
optimization ×1
order-by ×1
performance ×1
select ×1
sorting ×1
t-sql ×1
top ×1