当前位置: 首页 > 面试题库 >

mysql中每组的行号

阎承
2023-03-14
问题内容

我想根据这种情况生成查询结果,该方案可以根据crew_id和类型创建行号。

id   crew_id   amount    type
 1      4       1000      AUB
 2      4       1500      AUB
 3      5       8000      CA
 4      4       1000      CA
 5      5       1000      AUB
 6      6       3000      AUB
 7      4       2000      CA
 8      6       3500      AUB
 9      4       5000      AUB
 10     5       9000      CA
 11     5       1000      CA

输出必须为ff:

id    crew_id   amount   type    row_number
 1      4       1000      AUB        1    
 2      4       1500      AUB        2 
 9      4       5000      AUB        3
 4      4       1000      CA         1
 7      4       2000      CA         2
 5      5       1000      AUB        1
 3      5       8000      CA         1
 10     5       9000      CA         2
 11     5       1000      CA         3
 6      6       3000      AUB        1
 6      6       3000      AUB        2

我只想在此输出中使用一条选择语句


问题答案:

这个问题已经很老了。但是我想发布它,以防有人遇到相同的问题。

首先,描述的答案无法正确运行。例如,对于

id   crew_id   amount    type
1      4       1000      AUB
2      4       1500      AUB
5      5       1000      AUB
6      6       3000      AUB
8      6       3500      AUB
9      4       5000      AUB

(我刚刚删除了类型为“ CA”的行),结果表将是

id   crew_id   amount    rank   type
1      4       1000      1      AUB
2      4       1500      2      AUB
9      4       5000      3      AUB
5      5       1000      4      AUB
6      6       3000      5      AUB
8      6       3500      6      AUB

因此,实际上它并没有同时使用crew_id和type,而只是使用type。

这是我解决此问题的方法(可能有比使用两个嵌套的“ CASE”更优雅的方法,但是您知道了):

SELECT id,
    amount,
    CASE crew_id 
        WHEN @curCrewId THEN
            CASE type 
                WHEN @curType THEN @curRow := @curRow + 1 
                ELSE @curRow := 1
            END
        ELSE @curRow :=1
    END AS rank,
    @curCrewId := crew_id AS crew_id,
    @curType := type AS type
FROM Table1 p
JOIN (SELECT @curRow := 0, @curCrewId := 0, @curType := '') r
ORDER BY crew_id, type

主要思想仍然存在。我刚刚添加了一个变量@curCrewId。如果有人需要使用3个变量进行分组,则只需使用3个变量和3个嵌套的’CASE’。:)



 类似资料:
  • 问题内容: 我已阅读这篇文章:http : //www.xaprb.com/blog/2006/12/07/how- to-select-the-firstleastmax-row-per-group-in- sql/ 并搜索其他问题 我有一个像这样的表: 我正在尝试获取按user.id分组的table.id的计数,如果user.id的计数大于7,则仅将结果显示为7(也就是将计数结果限制为7)。

  • 问题内容: 所以我有这张桌子。它有几百行。每行中都有一个日期时间字段。我需要完成的是获取给定时间段内有多少行,而不是整个时间段,而是该时间段的每一天。到此为止,我知道该怎么办。但是,此外,我还需要在表中没有值0的日期的行。 因此,例如: 应该给我这样的结果: 任何人都可以帮忙吗? 问题答案: 为了处理带有0条对应记录的日期,我的常规做法是使用日历表进行联接。 例如,创建一个表,其中一个字段称为,并

  • 我正在使用SQL Server,数据库中有下表: 到目前为止我尝试了什么(错误的,因为它不计算每个组的平均值,而是计算所有列的总平均值):

  • 问题内容: 在C#中将是这样的: Linq-To-Sql将其转换为以下T-SQL代码: 但是它与MySQL不兼容。 问题答案: 当我写 有用。在其他RDBMS中,IIRC这样的语句是不可能的,因为不属于任何组合键的不属于分组键的列就被引用了。 这种“怪癖”的行为与我想要的行为非常接近。所以我用它来获得想要的结果:

  • 问题内容: 所以我有2张桌子,和。 具有列,具有呼叫者的ID和进行呼叫的时间。然后,我有另一台已,,,,,有一个人,他们的位置的ID ,而且它们在该位置的时间。 我想写一个看起来像这样的查询: 基本上,这是在寻找给定值的最接近值。之后,最终,我想根据数据查找呼叫的位置。 我该怎么做?我知道有一种基于集合的方法,但是我不想那样做。我调查了一下,但是我感到在那方面的表现很糟糕……所以循环中是否有这样做

  • 问题内容: 有没有更有效的方法来执行以下操作? 这个答案看起来很相似,但这是这样做的最好方法- 如何在MySQL中为每个组选择第一行? 谢谢, 克里斯。 PS表看起来像: 数据: 结果: 有关更多详细信息,请参见http://www.barricane.com/2012/02/08/mysql-select-last-matching- row.html 。 问题答案: 试试这个查询- 然后使用E