根据T-SQL中多个相关记录的排序顺序对记录进行排名?

理财人才

我有两个表,再加上一个匹配表。为了论证,我们称它们为“食谱和配料”。每个食谱应至少包含一种成分,但可以有许多成分。每种成分都可以在许多食谱中使用。

 Recipes           Ingredients       Match
 ===============   ===============   ===============
 ID   int          ID   int           RecipeID     int
 Name varchar      Name varchar       IngredientID int

样本数据:

 Recipes           Ingredients       Match (shown as CDL but stored as above)
 ===============   ===============   ===============
 Soup              Chicken           Soup:        Chicken, Tomatoes
 Pizza             Tomatoes          Pizza:       Cheese, Chicken, Tomatoes
 Chicken Sandwich  Cheese            C. Sandwich: Bread, Chicken, Tomatoes
 Turkey Sandwich   Bread             T. Sandwich: Bread, Cheese, Tomatoes, Turkey        
                   Turkey

这是问题所在:我需要根据其成分的名称食谱进行排序鉴于以上示例数据,我将需要此排序顺序用于配方:

 Turkey Sandwich    (First ingredient bread, then cheese)
 Chicken Sandwich   (First ingredient bread, then chicken)
 Pizza              (First ingredient cheese)
 Soup               (First ingredient chicken)

将食谱按第一种成分排序很简单:

 WITH recipesranked AS (
    SELECT Recipes.ID, Recipes.Name, Recipes.Description,
        ROW_NUMBER() OVER (ORDER BY Ingredients.Name) AS SortOrder
    FROM
        Recipes
        LEFT JOIN Match ON Match.RecipeID = Recipes.ID
        LEFT JOIN Ingredients ON Ingredients.ID = Match.IngredientID
    )
 SELECT   ID, Name, Description, MIN(SortOrder)
 FROM     recipesranked
 GROUP BY ID, Name, Description; 

除此之外,我被困住了。在上面的示例中,这几乎可行,但是两个三明治的排列顺序不明确。

我有一种感觉,MIN(SortOrder)应该将其替换为其他内容,也许是一个相关的子查询,以查找同一CTE中另一个记录的不存在,但是还没有弄清楚细节。

有任何想法吗?

(食谱可能没有任何成分。我不在乎它们以什么顺序出现,但是最终结果是理想的。这不是我目前主要关心的问题。)

我正在使用SQL Server 2008 R2。

更新:我为此添加了一个SQL Fiddle,并在此处更新了示例以使其匹配:

http://sqlfiddle.com/#!3/38258/2

更新:我有一个偷偷摸摸的怀疑,如果有解决方案,它将涉及交叉连接以将配方/成分的每种组合相互比较,然后以某种方式进行过滤。

弗格斯·鲍恩

我想这会给您您想要的东西(根据您提供的小提琴)

-- Show recipes ranked by all their ingredients alphabetically
 WITH recipesranked AS (
    SELECT Recipes.ID, Recipes.Name, SortedIngredients.SortOrder
    FROM
        Recipes
        LEFT JOIN Match ON Match.RecipeID = Recipes.ID
        LEFT JOIN
        (
          SELECT ID, Name, POWER(2.0, ROW_NUMBER() OVER (ORDER BY Name Desc)) As SortOrder 
          FROM Ingredients) AS SortedIngredients
         ON SortedIngredients.ID = Match.IngredientID
    )
 SELECT   ID, Name, SUM(SortOrder)
 FROM     recipesranked
 GROUP BY ID, Name
 -- Sort by sum of the ingredients. Since the first ingredient for both kinds 
 -- of sandwiches is Bread, this gives both of them the same sort order, but
 -- we need Turkey Sandwiches to come out first between them because Cheese
 -- is it's #2 sorted ingredient, but Chicken is the #2 ingredient for
 -- Chicken sandwiches.
 ORDER BY SUM(SortOrder) DESC;

它只是使用POWER来确保最重要的成分首先被称重。

这将适用于任意数量的食谱和多达120种成分(总计)

如果食谱中含有重复的成分,则将无法使用,尽管您可以在可能的情况下将其过滤掉

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

MSAccess中的SQL查询可根据其排序顺序对带有字母的值列进行排名

来自分类Dev

根据顺序对列进行排序后获取最新记录

来自分类Dev

根据T-SQL中的日期范围运行记录总数

来自分类Dev

如何根据记录中有多少关联记录匹配给定数组中的记录来对记录列表进行排序?

来自分类Dev

如何根据具有不同相关权重的两个字段对记录进行排序?

来自分类Dev

根据时间甘特图对记录进行排序

来自分类Dev

根据时间甘特图对记录进行排序

来自分类Dev

SQL根据两个条件返回排名最高的记录

来自分类Dev

SQL根据两个条件返回排名最高的记录

来自分类Dev

根据mysql中的相关性对结果进行排名

来自分类Dev

根据mysql中的相关性对结果进行排名

来自分类Dev

根据SQL中的下一个和上一个记录进行复杂的排序

来自分类Dev

如何使用 T-SQL 根据列中的值对行进行排名?

来自分类Dev

SQL Server 根据行值对不相关的记录进行分组

来自分类Dev

从文件中读取比赛结果,并根据相关分数按字母顺序对名称进行排序

来自分类Dev

根据脚本输入的顺序对文件中每个记录的字段重新排序

来自分类Dev

如何按递减的ORDER对列进行排序,如果找到绑定记录,则根据SQL中的另一列对它们进行排序?

来自分类Dev

T-sql查询可根据优先级从多个记录中选择

来自分类Dev

根据记录之间的分钟数以递归方式对SQL中的记录进行分组

来自分类Dev

ORACLE,根据相关记录显示记录

来自分类Dev

如何在mysql中根据月(六月至五月)对记录进行排序?

来自分类Dev

根据Excel中的位置对多个文本列表进行排名

来自分类Dev

如何根据列的变化值对记录进行分组/排序?

来自分类Dev

AASM:根据aasm_column对记录进行排序

来自分类Dev

根据指定的排名顺序对子图(水平条)进行排序

来自分类Dev

根据相关性对一个文档的多个查询进行排名

来自分类Dev

一个SQL语句,用于根据明细表中的匹配记录对主表中的记录进行计数?

来自分类Dev

根据SQL中的条件获取特定记录

来自分类Dev

如何根据时间在sql中合并记录

Related 相关文章

  1. 1

    MSAccess中的SQL查询可根据其排序顺序对带有字母的值列进行排名

  2. 2

    根据顺序对列进行排序后获取最新记录

  3. 3

    根据T-SQL中的日期范围运行记录总数

  4. 4

    如何根据记录中有多少关联记录匹配给定数组中的记录来对记录列表进行排序?

  5. 5

    如何根据具有不同相关权重的两个字段对记录进行排序?

  6. 6

    根据时间甘特图对记录进行排序

  7. 7

    根据时间甘特图对记录进行排序

  8. 8

    SQL根据两个条件返回排名最高的记录

  9. 9

    SQL根据两个条件返回排名最高的记录

  10. 10

    根据mysql中的相关性对结果进行排名

  11. 11

    根据mysql中的相关性对结果进行排名

  12. 12

    根据SQL中的下一个和上一个记录进行复杂的排序

  13. 13

    如何使用 T-SQL 根据列中的值对行进行排名?

  14. 14

    SQL Server 根据行值对不相关的记录进行分组

  15. 15

    从文件中读取比赛结果,并根据相关分数按字母顺序对名称进行排序

  16. 16

    根据脚本输入的顺序对文件中每个记录的字段重新排序

  17. 17

    如何按递减的ORDER对列进行排序,如果找到绑定记录,则根据SQL中的另一列对它们进行排序?

  18. 18

    T-sql查询可根据优先级从多个记录中选择

  19. 19

    根据记录之间的分钟数以递归方式对SQL中的记录进行分组

  20. 20

    ORACLE,根据相关记录显示记录

  21. 21

    如何在mysql中根据月(六月至五月)对记录进行排序?

  22. 22

    根据Excel中的位置对多个文本列表进行排名

  23. 23

    如何根据列的变化值对记录进行分组/排序?

  24. 24

    AASM:根据aasm_column对记录进行排序

  25. 25

    根据指定的排名顺序对子图(水平条)进行排序

  26. 26

    根据相关性对一个文档的多个查询进行排名

  27. 27

    一个SQL语句,用于根据明细表中的匹配记录对主表中的记录进行计数?

  28. 28

    根据SQL中的条件获取特定记录

  29. 29

    如何根据时间在sql中合并记录

热门标签

归档