Sql 按模糊准则分组

Sql 按模糊准则分组,sql,group-by,Sql,Group By,在SQL中有没有办法执行此任务: 有一个行李名称和重量的表格,看起来像这样 luggage_id | luggage_name | luggage_weight ------------+--------------+---------------- 1 | Tom | 2 2 | Kat | 3 3 | Lil

SQL
中有没有办法执行此任务:

有一个行李名称和重量的表格,看起来像这样

luggage_id | luggage_name | luggage_weight ------------+--------------+---------------- 1 | Tom | 2 2 | Kat | 3 3 | Lil | 4 然后我们会得到

luggage_name | luggage_name --------------+-------------- Tom | Kat Kat | Lil luggage_name | luggage_name --------------+-------------- Tom | Kat Tom | Lil Kat | Lil 行李|名称|行李|名称 --------------+-------------- 汤姆|凯特 吉里尔 这意味着Tom和Kat在一起,Kat和Lil在一起

但是,假设我们有一张重量相同的桌子

luggage_id | luggage_name | luggage_weight ------------+--------------+---------------- 1 | Tom | 1 2 | Kat | 1 3 | Lil | 1 行李|身份|行李|名称|行李|重量 ------------+--------------+---------------- 1 |汤姆| 1 2 | Kat | 1 3 | Lil | 1 然后我们会得到

luggage_name | luggage_name --------------+-------------- Tom | Kat Kat | Lil luggage_name | luggage_name --------------+-------------- Tom | Kat Tom | Lil Kat | Lil 行李|名称|行李|名称 --------------+-------------- 汤姆|凯特 汤姆·利尔 吉里尔
这意味着Tom和Kat和Lil在一起,这是正确的,但下一组,Kat和Lil已经在第一组了。我考虑过这个问题,不知道如何解决它。如何只输出不同的组?

您需要一个条件来将完全笛卡尔连接限制为三角形连接

SELECT t1.luggage_name, t2.luggage_name
FROM Luggages t1, Luggages t2
WHERE ABS(t1.luggage_weight - t2.luggage_weight) <= 1

AND
t1.luggageid < t2.luggageid

d=0.5
时,因为没有小于0.5的差异,所以没有对。与
d的输出相比,单例列表实际上是错误的。您需要一个条件来将完全笛卡尔连接限制为三角形连接

SELECT t1.luggage_name, t2.luggage_name
FROM Luggages t1, Luggages t2
WHERE ABS(t1.luggage_weight - t2.luggage_weight) <= 1

AND
t1.luggageid < t2.luggageid
d=0.5
时,因为没有小于0.5的差异,所以没有对。与
d的输出相比,单例列表实际上是错误的
它们彼此之间的距离都是D=1。如果您的查询有D=1,它将显示

Kat Lil
Lil Bob
Tom Kat
这显示了整个组Tom->Kat->Lil->Bob

它们彼此之间的距离都是D=1。如果您的查询有D=1,它将显示

Kat Lil
Lil Bob
Tom Kat

这显示了整个组Tom->Kat->Lil->Bob。

这不总是每个组输出一对吗?这不总是每个组输出一对吗?很有趣。这适用于所有具有相同权重但输出(不是您的代码)仍然感觉有趣的情况。这适用于所有权重相同但输出(而不是代码)仍然感觉错误的情况
SELECT t1.luggage_name, t2.luggage_name
FROM Luggages t1, Luggages t2
WHERE ABS(t1.luggage_weight - t2.luggage_weight) <= 1

AND
t1.luggageid < t2.luggageid
 luggage_name | luggage_name 
--------------+--------------
 Tom          | Kat
 Kat          | Lil
DECLARE @luggage TABLE (luggageid int IDENTITY(1,1), luggage_name varchar(30), luggage_weight float)
INSERT @luggage (luggage_name, luggage_weight) VALUES ('Tom', 2), ('Kat', 3), ('Lil', 4)

SELECT t1.luggage_name, t2.luggage_name
FROM @luggage t1, @luggage t2
WHERE ABS(t1.luggage_weight - t2.luggage_weight) <= 1
AND
t1.luggageid < t2.luggageid


SELECT t1.luggage_name, t2.luggage_name
FROM @luggage t1, @luggage t2
WHERE ABS(t1.luggage_weight - t2.luggage_weight) <= 2
AND
t1.luggageid < t2.luggageid


SELECT t1.luggage_name, t2.luggage_name
FROM @luggage t1, @luggage t2
WHERE ABS(t1.luggage_weight - t2.luggage_weight) <= 0.5
AND
t1.luggageid < t2.luggageid
SELECT t1.luggage_name, MIN(t2.luggage_name) GroupsWith
FROM Luggages t1
JOIN Luggages t2 ON ABS(t1.luggage_weight - t2.luggage_weight) <= 1
AND ((t1.luggage_weight < t2.luggage_weight)
  OR (t1.luggage_weight = t2.luggage_weight AND t1.luggage_name < t2.luggage_name))
GROUP BY t1.luggage_name
ORDER BY t1.luggage_name
Tom-2, Kat-3, Lil-4, Bob-5
Kat Lil
Lil Bob
Tom Kat