SQL 分组依据 分区依据
SQL Group By a Partition By
这必须在 MS SQL 服务器中完成。我相信 OVER( PARTITION BY)
必须被使用,但我所有的尝试都失败了,我最终计算了每个 ID 或其他东西的记录...
我有这个table:
| ID | COLOR |
+------+--------+
| 1 | Red |
| 1 | Green |
| 1 | Blue |
| 2 | Red |
| 2 | Green |
| 2 | Blue |
| 3 | Red |
| 3 | Brown |
| 3 | Orange |
请注意,ID = 1 和 ID = 2 的 COLOR 值完全相同,但 ID = 3 仅共享值 COLOR = Red。
我想将 table 分组如下:
| COLOR | COUNT | GROUPING |
+--------+-------+----------+
| Red | 2 | Type 1 |
| Green | 2 | Type 1 |
| Blue | 2 | Type 1 |
| Red | 1 | Type 2 |
| Brown | 1 | Type 2 |
| Orange | 1 | Type 2 |
这意味着 ID = 1 和 ID = 2 共享相同的 3 个颜色值,并且它们聚合在一起作为类型 1。虽然 ID = 3 共享一个颜色值到 ID = 1 和 ID = 2 (这是 'Red') 其余值不共享,因此它被认为是类型 2(不同分组)。
使用的 tables 是简单的例子,足以复制到整个数据集,但是理论上每个 ID 可以有数百条记录,每行中的颜色值不同。然而,它们是唯一的,一个ID在不同行中的颜色不能相同。
我最好的尝试:
SELECT
ID,
COLOR,
CONCAT ('TYPE ', COUNT(8) OVER( PARTITION by ID)) AS COLOR_GROUP
FROM
{TABLE};
结果:
| ID | COLOR | GROUPING |
+------+--------+----------+
| 1 | Green | Type 3 |
| 1 | Blue | Type 3 |
| 1 | Red | Type 3 |
| 2 | Green | Type 3 |
| 2 | Blue | Type 3 |
| 2 | Red | Type 3 |
| 3 | Red | Type 3 |
| 3 | Brown | Type 3 |
| 3 | Orange | Type 3 |
虽然结果很糟糕,但我尝试了不同的方法,其中 none 更好。
希望我说得够清楚了。
感谢您的帮助!
尝试以下操作:
declare @t table ( ID int,COLOR varchar(100))
insert into @t select 1 ,'Red'
insert into @t select 1 ,'Green'
insert into @t select 1 ,'Blue'
insert into @t select 2 ,'Red'
insert into @t select 2 ,'Green'
insert into @t select 2 ,'Blue'
insert into @t select 3 ,'Red'
insert into @t select 3 ,'Brown'
insert into @t select 3 ,'Orange'
select *, STUFF((SELECT CHAR(10) + ' '+COLOR
FROM @t t_in where t_in.ID=t.ID
order by COLOR
FOR XML PATH ('')) , 1, 1, '') COLOR_Combined
into #temp
from @t t
select COLOR, count(color) [COUNT], 'TYPE ' + convert(varchar(10), dense_rank() OVER (order by [grouping])) [GROUPING]
from
(
select id, COLOR, COLOR_Combined, (row_number() over (order by id) - row_number() over (partition by Color_Combined order by id)) [grouping]
from #temp
)t
group by COLOR, [grouping]
drop table if exists #temp
请找到数据库<>fiddle here.
这必须在 MS SQL 服务器中完成。我相信 OVER( PARTITION BY)
必须被使用,但我所有的尝试都失败了,我最终计算了每个 ID 或其他东西的记录...
我有这个table:
| ID | COLOR |
+------+--------+
| 1 | Red |
| 1 | Green |
| 1 | Blue |
| 2 | Red |
| 2 | Green |
| 2 | Blue |
| 3 | Red |
| 3 | Brown |
| 3 | Orange |
请注意,ID = 1 和 ID = 2 的 COLOR 值完全相同,但 ID = 3 仅共享值 COLOR = Red。
我想将 table 分组如下:
| COLOR | COUNT | GROUPING |
+--------+-------+----------+
| Red | 2 | Type 1 |
| Green | 2 | Type 1 |
| Blue | 2 | Type 1 |
| Red | 1 | Type 2 |
| Brown | 1 | Type 2 |
| Orange | 1 | Type 2 |
这意味着 ID = 1 和 ID = 2 共享相同的 3 个颜色值,并且它们聚合在一起作为类型 1。虽然 ID = 3 共享一个颜色值到 ID = 1 和 ID = 2 (这是 'Red') 其余值不共享,因此它被认为是类型 2(不同分组)。
使用的 tables 是简单的例子,足以复制到整个数据集,但是理论上每个 ID 可以有数百条记录,每行中的颜色值不同。然而,它们是唯一的,一个ID在不同行中的颜色不能相同。
我最好的尝试:
SELECT
ID,
COLOR,
CONCAT ('TYPE ', COUNT(8) OVER( PARTITION by ID)) AS COLOR_GROUP
FROM
{TABLE};
结果:
| ID | COLOR | GROUPING |
+------+--------+----------+
| 1 | Green | Type 3 |
| 1 | Blue | Type 3 |
| 1 | Red | Type 3 |
| 2 | Green | Type 3 |
| 2 | Blue | Type 3 |
| 2 | Red | Type 3 |
| 3 | Red | Type 3 |
| 3 | Brown | Type 3 |
| 3 | Orange | Type 3 |
虽然结果很糟糕,但我尝试了不同的方法,其中 none 更好。
希望我说得够清楚了。
感谢您的帮助!
尝试以下操作:
declare @t table ( ID int,COLOR varchar(100))
insert into @t select 1 ,'Red'
insert into @t select 1 ,'Green'
insert into @t select 1 ,'Blue'
insert into @t select 2 ,'Red'
insert into @t select 2 ,'Green'
insert into @t select 2 ,'Blue'
insert into @t select 3 ,'Red'
insert into @t select 3 ,'Brown'
insert into @t select 3 ,'Orange'
select *, STUFF((SELECT CHAR(10) + ' '+COLOR
FROM @t t_in where t_in.ID=t.ID
order by COLOR
FOR XML PATH ('')) , 1, 1, '') COLOR_Combined
into #temp
from @t t
select COLOR, count(color) [COUNT], 'TYPE ' + convert(varchar(10), dense_rank() OVER (order by [grouping])) [GROUPING]
from
(
select id, COLOR, COLOR_Combined, (row_number() over (order by id) - row_number() over (partition by Color_Combined order by id)) [grouping]
from #temp
)t
group by COLOR, [grouping]
drop table if exists #temp
请找到数据库<>fiddle here.