Sql server SQL按多个列分组,这些列具有多个唯一的列分组值

Sql server SQL按多个列分组,这些列具有多个唯一的列分组值,sql-server,Sql Server,我正在寻找一种通过两列进行分组的方法,其中第一个分组列对第二个分组列具有多个唯一值。下面是一个带有示例数据的示例表 CREATE TABLE [dbo].[MyTable]( [ID] [int] IDENTITY(1,1) NOT NULL, [Type] [varchar](20) NOT NULL, [UnitOfMeasure] [varchar](20) NULL, CONSTRAINT [PK_MyTable] PRIMARY KEY CLUSTERED

我正在寻找一种通过两列进行分组的方法,其中第一个分组列对第二个分组列具有多个唯一值。下面是一个带有示例数据的示例表

CREATE TABLE [dbo].[MyTable](
    [ID] [int] IDENTITY(1,1) NOT NULL,
    [Type] [varchar](20) NOT NULL,
    [UnitOfMeasure] [varchar](20) NULL,
 CONSTRAINT [PK_MyTable] PRIMARY KEY CLUSTERED 
(
    [ID] ASC
) ON [PRimary]
) ON [PRimary];

INSERT INTO [MyTable] (Type, UnitOfMeasure)
VALUES ('height', 'cm')
,   ('distance', 'km')
,   ('weight', 'kg')
,   ('Glucose', 'mg/dL')
,   ('weight', 'kg')
,   ('Duration', 'hours')
,   ('Glucose', 'mg/dL')
,   ('Glucose', 'mg/dL')
,   ('height', 'cm')
,   ('Allergy', 'kUnits/L')
,   ('Volume', 'mL')
,   ('height', 'inch')
,   ('height', 'cm')
,   ('Chloride', 'mmol/L')
,   ('Volume', 'cup')
,   ('distance', 'km')
,   ('Volume', 'cup')
,   ('Duration', 'hours')
,   ('Chloride', 'mmol/L')
,   ('Duration', 'minutes');
所需的输出如下

Type        UnitOfMeasure
Duration    hours
Duration    minutes
height      cm
height      inch
Volume      cup
Volume      mL

此输出包括持续时间,因为它有两个度量单位。但是,它不包括重量,也不包括氯化物,因为它只有一个测量单位。

您可以使用CTE获得一个不同的计数,然后使用EXISTS和另一个不同的计数。但我认为这会有点贵,理想情况下,您可能希望处理那些重复的行

计为 选择[类型], 将不同的度量单位计数为不同的度量单位 从dbo.MyTable 按[类型]分组 选择不同的 [类型], 计量单位 从dbo.MyTable MT 在存在的位置选择1 来自计数C 其中C.[Type]=MT.[Type] 和C.distinctmasures>1;
您可以使用CTE来获取一个不同的计数,然后使用EXISTS和另一个不同的计数。但我认为这会有点贵,理想情况下,您可能希望处理那些重复的行

计为 选择[类型], 将不同的度量单位计数为不同的度量单位 从dbo.MyTable 按[类型]分组 选择不同的 [类型], 计量单位 从dbo.MyTable MT 在存在的位置选择1 来自计数C 其中C.[Type]=MT.[Type] 和C.distinctmasures>1;
您可以通过以下方式执行此操作:

SELECT DISTINCT t.[Type], t.[UnitOfMeasure]
FROM [MyTable] t
WHERE EXISTS (
  SELECT 1 FROM [MyTable]
  WHERE [Type] = t.[Type] AND [UnitOfMeasure] <> t.[UnitOfMeasure]
)

您可以通过以下方式执行此操作:

SELECT DISTINCT t.[Type], t.[UnitOfMeasure]
FROM [MyTable] t
WHERE EXISTS (
  SELECT 1 FROM [MyTable]
  WHERE [Type] = t.[Type] AND [UnitOfMeasure] <> t.[UnitOfMeasure]
)

您只能使用窗口函数执行此操作。只需比较每种类型的最小单位和最大单位:如果它们不同,则您知道至少有两个不同的值,并且可以保留相应的行:

select distinct type, unitofmeasure
from (
    select t.*,
        min(unitofmeasure) over(partition by type) min_unit,
        max(unitofmeasure) over(partition by type) max_unit
    from mytable t
) t
where min_unit <> max_unit

您只能使用窗口函数执行此操作。只需比较每种类型的最小单位和最大单位:如果它们不同,则您知道至少有两个不同的值,并且可以保留相应的行:

select distinct type, unitofmeasure
from (
    select t.*,
        min(unitofmeasure) over(partition by type) min_unit,
        max(unitofmeasure) over(partition by type) max_unit
    from mytable t
) t
where min_unit <> max_unit

奇怪的是,您有重复的行;你考虑过解决这个问题吗?为了简化问题,我没有包括其他专栏,在你看来,这些专栏似乎有重复之处。查询的目标是识别具有冲突度量单位的类型,例如具有cm和mL度量单位的类型。我正在处理的表有数百万行,其中包含10000多个类型。只需要限制要检查的类型的数量。提供的查询将类型的数量减少到700多个;你考虑过解决这个问题吗?为了简化问题,我没有包括其他专栏,在你看来,这些专栏似乎有重复之处。查询的目标是识别具有冲突度量单位的类型,例如具有cm和mL度量单位的类型。我正在处理的表有数百万行,其中包含10000多个类型。只需要限制要检查的类型的数量。提供的查询将类型数减少到略多于700个。谢谢!比我想象的简单多了。谢谢!比我想象的简单多了。