标签: distinct

在多列上选择 DISTINCT

假设我们有一个包含四列(a,b,c,d)相同数据类型的表。

是否可以选择列中数据中的所有不同值并将它们作为单个列返回,或者我是否必须创建一个函数来实现这一点?

postgresql performance postgresql-9.4 distinct postgresql-performance

24
推荐指数
4
解决办法
8万
查看次数

DISTINCT 不将两个相等的值减为一

谁能解释下面的情况,其中两个看似相等的值没有减少DISTINCT

显示“SBS_UCS_DISPATCH”的两个值的屏幕截图

上面的查询是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不会产生行。

@@VERSIONMicrosoft 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:)

sql-server system-tables distinct

18
推荐指数
1
解决办法
1168
查看次数

根据其他 3 列组合的重复值,获取一列具有不同值的行

我想根据具有其他 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)

sql-server t-sql distinct

13
推荐指数
1
解决办法
8万
查看次数

仅选择对特定列具有不同/多个值的记录

下面是我的会员表的一个例子。在电子邮件字段中有一些记录具有多个值。我只想选择那些具有多个电子邮件值的记录:

会员表

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 列以上。电话和地址等还有额外的列。一个成员可能有多个条目,因为他/她有多个电话号码或地址。我只想捕获那些拥有多个电子邮件地址的人。

这是数据库清理的一部分,将添加主键。我应该进一步澄清,有些人可能有多个具有相同电子邮件地址的条目。在此阶段,我不想捕获具有相同电子邮件地址的多个条目,而只想捕获具有不同电子邮件地址的多个条目的那些条目。

count select distinct

12
推荐指数
1
解决办法
8万
查看次数

一列上的 DISTINCT 并返回 TOP 行

你如何查询三个最大的唯一客户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 distinct top

9
推荐指数
1
解决办法
2万
查看次数

是否可以为不同/分组获得基于搜索的并行计划?

这个问题的一个例子表明,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 的已知问题): …

index sql-server optimization group-by distinct

8
推荐指数
1
解决办法
415
查看次数

SQL 查询仅显示单个食品的最近购买记录

我正在使用 MS Access 2013 中的食品采购/发票系统,并尝试创建一个 SQL 查询,该查询将返回每个单独食品的最新购买价格。

这是我正在使用的表的图表: MS Access 数据库中的表

我对 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]

更重要的是 …

join ms-access sorting date distinct

8
推荐指数
1
解决办法
2万
查看次数

SELECT DISTINCT ON,按另一列排序

请考虑下表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

8
推荐指数
2
解决办法
3867
查看次数

获取每个 ID 的最后 5 个不同值

我正在使用 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)

postgresql greatest-n-per-group distinct

7
推荐指数
2
解决办法
1万
查看次数

为什么两个相同的字符串长度不同但二进制值相同?

我试图从表中返回一组不同的部门名称 - 没什么特别的。但是,使用以下查询时会显示重复项:

  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确实会产生一个唯一的结果集。

我也尝试在VARCHARNVARCHAR和到不同的排序规则之间进行转换(值在同一列中,在使用 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 …

sql-server collation distinct sql-server-2016

7
推荐指数
1
解决办法
1677
查看次数