简体   繁体   English

如何重复根据列值选择行,并且在另一列中具有不同的值

[英]How to select rows based on column value is repeating and has different values in another column

I need to query a table in order to return rows, but I'm not able to query the table correctly. 我需要查询表以返回行,但是我无法正确查询表。 Here is my table view: 这是我的表格视图:

Id  Name    Date        Subject     TrackingToken   RegardingObjectId                       Type    TypeName
1   XXXX    8/26/2015   RE: XXXXXX  CRM:0030062     496BF810-4DBE-E311-9357-00505686395E    112 RE: YYYY
1   XXXX    8/27/2015   RE: XXXXXX  CRM:0030055     AA8C2F71-CDD1-E311-894A-005056863ADA    112 RE: YYYY
1   XXXX    8/28/2015   RE: XXXXXX  CRM:0030055     4DF02C89-2FBE-E311-9357-00505686395E    112 RE: YYYY
1   XXXX    8/29/2015   RE: XXXXXX  CRM:0030049     496BF810-4DBE-E311-9357-00505686395E    112 RE: YYYY
1   XXXX    8/30/2015   RE: XXXXXX  CRM:0030049     06393EF9-71CC-E311-894A-005056863ADA    112 RE: YYYY
1   XXXX    8/31/2015   RE: XXXXXX  CRM:0030047     8BE51823-52BE-E311-9357-00505686395E    112 RE: YYYY
1   XXXX    9/1/2015    RE: XXXXXX  CRM:0030003     6ABE11CA-BABF-E311-89E9-005056863ADA    112 RE: YYYY

The result set should return: 结果集应返回:

Id  Name    Date        Subject     TrackingToken   RegardingObjectId                       Type    TypeName
1   XXXX    8/27/2015   RE: XXXXXX  CRM:0030055     AA8C2F71-CDD1-E311-894A-005056863ADA    112 RE: YYYY
1   XXXX    8/28/2015   RE: XXXXXX  CRM:0030055     4DF02C89-2FBE-E311-9357-00505686395E    112 RE: YYYY
1   XXXX    8/29/2015   RE: XXXXXX  CRM:0030049     496BF810-4DBE-E311-9357-00505686395E    112 RE: YYYY
1   XXXX    8/30/2015   RE: XXXXXX  CRM:0030049     06393EF9-71CC-E311-894A-005056863ADA    112 RE: YYYY

In other words: Select all records where column TrackingToken is repeating and RegardingObjectId has different value. 换句话说:选择所有重复TrackingToken列且RegardingObjectId具有不同值的记录。

Current Query: 当前查询:

select [OwnerId],[OwnerIdName],[CreatedOn],[Subject],
[TrackingToken],[RegardingObjectId],
[RegardingObjectTypeCode],[RegardingObjectIdName]

from [TableX].[dbo].[Email] a
where not exists (select [TrackingToken], [RegardingObjectId]
                  from [TableX].[dbo].[Email] b
                  where a.[TrackingToken] = b.[TrackingToken]
                    and a.[RegardingObjectId] = b.[RegardingObjectId]
                    AND RegardingObjectTypeCode = 112
                  group by [TrackingToken],[RegardingObjectId]
                  having count(*)> 1)
  and a.TrackingToken in (select TrackingToken
                          from [TableX].[dbo].[Email]
                          group by TrackingToken
                          having count(*) > 1)
  and a.RegardingObjectId is not null
  and a.RegardingObjectTypeCode = 112
  and a.TrackingToken is not null
order by a.TrackingToken desc

You can count the distinct number of [RegardingObjectId]: 您可以计算[RegardingObjectId]的不同数量:

select TrackingToken
from [TableX].[dbo].[Email]
group by TrackingToken
having count(distinct [RegardingObjectId]) > 1

You can use the analytic version of COUNT to count records over a certain range (within the TrackingToken in your case). 您可以使用COUNT的分析版本对一定范围内的记录进行计数(在您的案例中为TrackingToken内)。 Then only keep those records where the count of different RegardingObjectId is greater than one. 然后只保留那些RegardingObjectId的计数大于1的记录。

select *
from
(
  select mytable.* 
    , count(distinct regardingobjectid) over (partition by trackingtoken) as cnt
  from mytable
) counted
where cnt > 1;

EDIT: As Felix Pamittan pointed out, SQL Server doesn't fully support COUNT OVER, such that you cannot use DISTINCT with it. 编辑:正如Felix Pamittan所指出的那样,SQL Server并不完全支持COUNT OVER,因此您不能对其使用DISTINCT。 So here is the same with the normal COUNT aggregation: 因此,这与常规的COUNT聚合相同:

select mytable.* 
from mytable
where 
(
  select count(distinct token.regardingobjectid) 
  from mytable token
  where token.trackingtoken = mytable.trackingtoken
) > 1;

Or without a correlated subquery, but a derived table instead: 或没有相关子查询,而是派生表:

select mytable.* 
from mytable
join
(
  select trackingtoken
  from mytable
  group by trackingtoken
  having count(distinct regardingobjectid) > 1
) tokens on tokens.trackingtoken = mytable.trackingtoken;

The below is a working example 下面是一个工作示例

CREATE TABLE #X(Id INT,Name NVARCHAR(8),Date DATE,Subject NVARCHAR(16),TrackingToken NVARCHAR(14),RegardingObjectId UNIQUEIDENTIFIER,Type INT,TypeName NVARCHAR(8))

INSERT INTO #X(Id,Name,Date,Subject,TrackingToken,RegardingObjectId,Type,TypeName)
VALUES
(1,'XXXX','8/26/2015','RE: XXXXXX','CRM:0030062','496BF810-4DBE-E311-9357-00505686395E',112,'RE: YYYY'),
(1,'XXXX','8/27/2015','RE: XXXXXX','CRM:0030055','AA8C2F71-CDD1-E311-894A-005056863ADA',112,'RE: YYYY'),
(1,'XXXX','8/28/2015','RE: XXXXXX','CRM:0030055','4DF02C89-2FBE-E311-9357-00505686395E',112,'RE: YYYY'),
(1,'XXXX','8/29/2015','RE: XXXXXX','CRM:0030049','496BF810-4DBE-E311-9357-00505686395E',112,'RE: YYYY'),
(1,'XXXX','8/30/2015','RE: XXXXXX','CRM:0030049','06393EF9-71CC-E311-894A-005056863ADA',112,'RE: YYYY'),
(1,'XXXX','8/31/2015','RE: XXXXXX','CRM:0030047','8BE51823-52BE-E311-9357-00505686395E',112,'RE: YYYY'),
(1,'XXXX','9/1/2015' ,'RE: XXXXXX','CRM:0030003','6ABE11CA-BABF-E311-89E9-005056863ADA',112,'RE: YYYY')

SELECT      A.*
FROM        #X AS A
INNER JOIN
    (
        SELECT      TrackingToken
        FROM        #X
        GROUP BY    TrackingToken
        HAVING      COUNT(*) > 1
    ) AS O ON O.TrackingToken = A.TrackingToken

DROP TABLE #X

You can optimize this by adding an index to the TrackingToken column 您可以通过在TrackingToken列中添加索引来对此进行优化

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 如何基于另一个具有多个值的表中的列值从表中选择行? - How to select rows from a table based on a column value in another table that has multiple values? 如何选择第1列中具有相同值但第2列中具有不同值的行? - How to SELECT rows that has same values in column 1 but different values in column 2? 选择具有相同ID但另一列中具有不同值的行 - Select rows with same ID but has different values in another column 如何 select 列值基于另一列中某个值的存在 - How to select column values based on the presence of a certain value in another column 在多行中查找同一列中具有相同值的行,而另一列具有不同值 - Find row that has same value in one column over multiple rows while another column has different values SQL,根据时间(列)选择行,当另一列具有特定值时发生时间 - SQL, select rows based on time (column), time occurs when another column has a certain value 如何 select 特定列具有最高值而另一列具有特定值的行 - How to select rows where a specific column has the highest value and another column has a specific value 当另一列具有匹配值时,选择一列中具有最大值的行 - Select Rows With the Greatest Value In One Column When Another Column Has matching Values 选择一列值相同但另一列值不同的行 - Select rows with same value in one column but different value in another column 根据不同列中的计数重复行-SQL - Repeating rows based on count in a different column - SQL
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM