微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

按模糊标准分组

如何解决按模糊标准分组

| 有什么办法可以在
sql
中执行此任务: 有一张像这样的行李箱名称和重量表  cargo_id |行李名|行李重量 ------------ + -------------- + ----------------           1 |汤姆| 2           2 |吉| 3           3 | Lil | 4 输出重量小于或等于D单位的一组东西。因此,如果D等于1,我们必须得到 1.汤姆·凯特 2.凯特·利尔 如果D等于2,我们必须得到 1.汤姆·凯特·利尔 如果D为0.5,我们得到 1.汤姆 2.吉 3.律 我试图使用交叉连接:
SELECT t1.luggage_name,t2.luggage_name
FROM Luggages t1,Luggages t2
WHERE ABS(t1.luggage_weight - t2.luggage_weight) <= 1
导致  行李名|行李名 -------------- + --------------  汤姆|汤姆  汤姆|吉  吉|汤姆  吉|吉  吉| l  Lil |吉  Lil | l
sql
可以解决这个问题吗?
EDIT
好,是的,我们可以写
SELECT t1.luggage_name,Luggages t2
WHERE ABS(t1.luggage_weight - t2.luggage_weight) <= 1
      AND t1.luggage_id < t2.luggage_id
然后我们会得到  行李名|行李名 -------------- + --------------  汤姆|吉  吉| l 这意味着Tom与Kat在一起,而Kat与Lil在一起。 但是,假设我们的桌子都具有相同的权重  cargo_id |行李名|行李重量 ------------ + -------------- + ----------------           1 |汤姆| 1个           2 |吉| 1个           3 | Lil | 1个 然后我们会得到  行李名|行李名 -------------- + --------------  汤姆|吉  汤姆| l  吉| l 这意味着汤姆和凯特和利尔在一起是正确的,但是下一组,凯特和利尔在一起已经在第一组中。我考虑了这个问题,无法解决。如何仅输出不同的组?     

解决方法

您需要一个条件来将整个笛卡尔坐标限制为三角形联接
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
d=0.5
时,由于没有小于0.5的差,所以您没有对。与
d <= 1
的输出相比,单例列表实际上是错误的 编辑2:为那些您没有得到的证明...
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,@luggage t2
WHERE ABS(t1.luggage_weight - t2.luggage_weight) <= 2
AND
t1.luggageid < t2.luggageid


SELECT t1.luggage_name,@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
它们彼此都是D = 1。如果您的查询的D = 1,它将显示
Kat Lil
Lil Bob
Tom Kat
其中显示了整个组Tom-> Kat-> Lil-> Bob。     

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。