我有三个工作表:玩家、团队和权重(当确定玩家-团队匹配时,特定属性被赋予多大的权重)。
参与者
| 名称名称名称|年龄|高度|罚球命中率|一个人。|
| - -|- -|- -|- -|- -|
| 博德|二十三个|七十四人|六十二岁|一个人。|
团队|团队名称(_N)|年龄|高度|罚球命中率|一个人。||- —————————-|- ———-|- ——————-|- ———————————————-|- ———-||团队1| 23| 78|62|...|
砝码|团队名称(_N)|年龄|高度|罚球命中率|一个人。||:—————————:|:———:|:——————:|:———————————————:|:———:||团队1|五个|10个|10个|一个人。|
CREATE TABLE players (name, age, height, free_throw_perc) AS
SELECT 'Alice', 20, 160, 90 FROM DUAL UNION ALL
SELECT 'Betty', 21, 165, 80 FROM DUAL UNION ALL
SELECT 'Carol', 22, 170, 70 FROM DUAL UNION ALL
SELECT 'Debra', 23, 175, 60 FROM DUAL UNION ALL
SELECT 'Emily', 24, 180, 50 FROM DUAL UNION ALL
SELECT 'Fiona', 25, 185, 40 FROM DUAL UNION ALL
SELECT 'Gerri', 26, 190, 30 FROM DUAL UNION ALL
SELECT 'Heidi', 27, 195, 20 FROM DUAL UNION ALL
SELECT 'Irene', 28, 200, 10 FROM DUAL;
CREATE TABLE teams (team_name, age, height, free_throw_perc) AS
SELECT 'ALPHA', 20,175,90 FROM DUAL;
CREATE TABLE weights team_name, age, height, free_throw_perc) AS
SELECT 'ALPHA', 5,10,10 FROM DUAL;
球队表与球员表相对应,但包含每个球队的记录,详细说明了基于当前球队组成的理想球员。权重表包含每个球队的记录,用整数值权重说明了他们对每个球员属性的关注程度。我正在尝试计算每个球员-球队组合的总比赛得分。我可以很容易地用Python做到这一点,但我很难在SQL中完成同样的任务。
在Python中,这将是一个简单的for循环,使用逻辑运算符将一个 Dataframe 的每个单元格与另一个 Dataframe 的每个单元格进行比较,但SQL中缺少位置引用,这使得实现和推广起来更加困难(能够对具有不同属性的其他表对使用相同的查询)。
到目前为止我已经
BEGIN
FOR c in (SELECT column_name FROM all_tab_columns WHERE table_name = 'teams')
LOOP
INSERT INTO match_table (players.Name, candidates.c)
SELECT players.Name, players.c WHERE players.c = teams.c
END LOOP;
BEGIN
FOR c IN (SELECT column_name FROM all_tab_columns WHERE table_name = 'weights')
LOOP
UPDATE match_table
SET match_table.c = (SELECT weights.c FROM weights WHERE match_table.c = weights.c)
END LOOP;
根据我所知道的,它将生成一个球员姓名表,其中一列对应于球队属性的匹配项,并填充相应的权重,而其他所有列都填充空值。如果是这样,我可以按姓名分组,创建一个包含所有匹配项和相应权重的单个记录。
脚本应循环遍历每个球员和球队,并将球员的属性与球队所需的属性进行比较。如果匹配,则应在match_table中添加一个新行,其中包含球员姓名和空值(匹配列除外)。对于每个球员-球队属性匹配,都应执行此操作。然后,这些匹配项应替换为权重表中的相应权重。然后,我想将它们相加,得到总的匹配分数。我不能使用'+'运算符,因为列名会有所不同。它们在三个表之间总是匹配的,但会有不同的感兴趣的属性。
预期的输出如下所示:
| players.name | 年龄|高度|罚球命中率|一个人。|
| - -|- -|- -|- -|- -|
| “爱丽丝”|五个|空值|空值|一个人。|
| “爱丽丝”|空值|10个|空值|一个人。|
然后,我如何对每条记录求和,以找到团队中每个候选人的总匹配分数?
1条答案
按热度按时间ccgok5k51#
如果您有范例数据:
您想要将
weights
数据表中weight
数据行的总和乘以players
数据表中的个别值,插入下列数据表:然后,您可以使用下列
INSERT
查询:然后,该表将包含加权合计:
| 团队|价值|
| - -|- -|
| 2个|六百六十个|
| 三个|三百九十三|
| 一个|三百五十八点五|
fiddle
如果您的
match_table
为:然后,您可以使用查询(并使用
+
运算子计算总计):它给出的值为:
| 球员|团队|年龄|高度|自由投掷PERC|总计|
| - -|- -|- -|- -|- -|- -|
| 爱丽斯|一个|20个|八十个|十八岁|一百一十八个|
| 贝蒂|一个|二十一个|八十二点五|十六岁|一百一十九点五|
| 卡罗尔|一个|二十二个|八十五个|十四|一百二十一|
| 黛布拉|2个|第0页|一百七十五|四十八|二百二十三|
| 艾米丽|2个|第0页|一百八十个|四十个|二百二十人|
| 菲奥娜|2个|第0页|一百八十五|三十二个|二一七|
| 格里|三个|十三个|九十五个|30个|一百三十八|
| 海迪|三个|十三点五|九十七点五|20个|一百三十一|
| 艾琳|三个|十四|100个|10个|一百二十四|
fiddle
或者,如果球员与球队无关,则:
对于样本数据,输出:
| 球员|团队|年龄|高度|自由投掷PERC|总计|
| - -|- -|- -|- -|- -|- -|
| 爱丽斯|一个|20个|八十个|十八岁|一百一十八个|
| 爱丽斯|2个|第0页|一百六十个|七十二人|二百三十二|
| 爱丽斯|三个|10个|八十个|九十|一百八十个|
| 贝蒂|一个|二十一个|八十二点五|十六岁|一百一十九点五|
| 贝蒂|2个|第0页|一百六十五|六十四|二百二十九人|
| 贝蒂|三个|10.5分|八十二点五|八十个|一百七十三|
| 卡罗尔|一个|二十二个|八十五个|十四|一百二十一|
| 卡罗尔|2个|第0页|一百七十个|五十六人|二百二十六|
| 卡罗尔|三个|十一|八十五个|七十个|一百六十六|
| 黛布拉|一个|二十三个|八十七点五|十二个|一百二十二点五|
| 黛布拉|2个|第0页|一百七十五|四十八|二百二十三|
| 黛布拉|三个|十一点五|八十七点五|六十个|一百五十九|
| 艾米丽|一个|二十四人|九十|10个|一百二十四|
| 艾米丽|2个|第0页|一百八十个|四十个|二百二十人|
| 艾米丽|三个|十二个|九十|五十个|一百五十二|
| 菲奥娜|一个|二十五个|九十二点五|八个|一百二十五点五|
| 菲奥娜|2个|第0页|一百八十五|三十二个|二一七|
| 菲奥娜|三个|十二点五|九十二点五|四十个|一百四十五|
| 格里|一个|二十六人|九十五个|六个|一百二十七|
| 格里|2个|第0页|一百九十|二十四人|二一四|
| 格里|三个|十三个|九十五个|30个|一百三十八|
| 海迪|一个|二十七人|九十七点五|四个|一百二十八点五|
| 海迪|2个|第0页|一百九十五|十六岁|二一一|
| 海迪|三个|十三点五|九十七点五|20个|一百三十一|
| 艾琳|一个|二十八人|100个|2个|一百三十个|
| 艾琳|2个|第0页|二百个|八个|二百零八人|
| 艾琳|三个|十四|100个|10个|一百二十四|
fiddle