gpt4 book ai didi

sql - 关联 varchar 值

转载 作者:行者123 更新时间:2023-12-04 15:03:31 27 4
gpt4 key购买 nike

Oracle 11 中是否有内置方法来检查 varchar2 字段中值的相关性?例如,给定一个简单的表,如下所示:

MEAL_NUM  INGREDIENT
--------------------
1 BEEF
1 CHEESE
1 PASTA
2 CHEESE
2 PASTA
2 FISH
3 CHEESE
3 CHICKEN

我想得到一个基于 MEAL_NUM 的数字指示,CHEESE 主要与 PASTA 搭配,而与 BEEF、CHICKEN 和 FISH 搭配的程度降低。

我的第一个倾向是使用 CORR 函数并将字符串转换为数字,方法可能是预先枚举它们或从唯一的选择中获取 rownum。

任何建议如何解决这个问题?

最佳答案

你不会想使用 CORR -- 如果您创建“食物编号”并指定牛肉 = 1、鸡肉 = 2 和意大利面 = 3,那么相关系数将告诉您奶酪的增加是否与“食物编号”的增加相关。但是“食物数量”的高或低并不意味着什么,因为你是编造出来的。所以,不要使用 CORR除非您的食物实际上是以某种方式订购的,例如数字。

统计学家谈论这个的方式是 levels of measurement .在链接文章的语言中,MEAL_NUM是一个名义度量——或者如果饭菜按顺序发生,则可能是一个有序度量,但无论哪种方式,对它使用相关系数都是一个非常糟糕的主意。

相反,您可能想要找到诸如“牛肉餐中有多少百分比还含有奶酪?”之类的内容。对于每种成分,以下将返回包含它的膳食数量以及包含它和奶酪的膳食数量。诀窍是COUNT只计算非空值。

SELECT Other.Ingredient, 
COUNT(*) AS TotalMeals,
COUNT(Cheese.Ingredient) AS CheesyMeals
FROM table Other
LEFT JOIN table Cheese
ON (Cheese.Ingredient = 'Cheese'
AND Cheese.Meal_Num = Other.Meal_Num)
GROUP BY Other.Ingredient

警告:如果您在任何一顿饭中两次包含一种成分,则会返回错误的结果。

编辑:事实证明您对奶酪并不特别感兴趣。你真的想要所有的“相关性”对。因此,我们可以将“奶酪”抽象出来,并称它们为第一和第二成分。我在这个中添加了一个“PossibleScore”,它试图表现得像膳食的百分比,但如果该成分的实例很少,则不会给出很高的分数。
SELECT First.Ingredient, 
Second.Ingredient,
COUNT(*) AS MealsWithFirst,
COUNT(First.Ingredient) AS MealsWithBoth,
COUNT(First.Ingredient) / (COUNT(*) + 3) AS PossibleScore,
FROM table First
LEFT JOIN table Second
ON (First.Meal_Num = Second.Meal_Num)
GROUP BY First.Ingredient, Second.Ingredient

按分数排序时,这应该返回
PASTA    CHEESE    2    2    0.400
CHEESE PASTA 3 2 0.333
BEEF CHEESE 1 1 0.250
BEEF PASTA 1 1 0.250
FISH CHEESE 1 1 0.250
FISH PASTA 1 1 0.250
CHICKEN CHEESE 1 1 0.250
PASTA BEEF 2 1 0.200
PASTA FISH 2 1 0.200
CHEESE BEEF 3 1 0.167
CHEESE FISH 3 1 0.167
CHEESE CHICKEN 3 1 0.167

关于sql - 关联 varchar 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6834744/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com