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