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个。谢谢!比我想象的简单多了。谢谢!比我想象的简单多了。