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

MySQL 5.6-类似于DENSE_RANK的功能,无需订购

黎征
2023-03-14
问题内容

我有一张这样的桌子:

+------+-----------+
|caseID|groupVarian|
+------+-----------+
|1     |A,B,C,D,E  |
+------+-----------+
|2     |A,B,N,O,P  |
+------+-----------+
|3     |A,B,N,O,P  |
+------+-----------+
|4     |A,B,C,D,F  |
+------+-----------+
|5     |A,B,C,D,E  |
+------+-----------+

我想获得一个新列nameVarian,以使相同的groupVarian值具有由表示的相同排名nameVarian(例如:v1,v2等)。但是,nameVarian分配给特定值的值groupVarian应按照caseID(在表中出现的顺序)的顺序。

输出应该是这样的:

+------+-----------+----------+
|caseID|groupVarian|namevarian
+------+-----------+----------+
|1     |A,B,C,D,E  |v1        |
+------+-----------+----------+
|2     |A,B,N,O,P  |v2        |
+------+-----------+----------+
|3     |A,B,N,O,P  |v2        |
+------+-----------+----------+
|4     |A,B,C,D,F  |v3        |
+------+-----------+----------+
|5     |A,B,C,D,E  |v1        |
+------+-----------+----------+

问题答案:

对于 MySQL版本
<8.0
(OP的版本是5.6):

问题陈述看起来需要DENSE_RANK功能groupVarian; 但是事实并非如此。正如 @Gordon
Linoff

解释的

那样

您似乎希望按它们在数据中出现的顺序来枚举它们。

假设您的表名是t(请为您的代码相应地更改表名和字段名)。这是一种利用会话变量的方法(
对于MySQL的较早版本 ),给出期望的结果( DB Fiddle ):

SET @row_number = 0;
SELECT t3.caseID, 
       t3.groupVarian, 
       CONCAT('v', t2.num) AS nameVarian
FROM
  (
   SELECT 
     (@row_number:=@row_number + 1) AS num, 
     t1.groupVarian 
   FROM 
     (
      SELECT DISTINCT groupVarian 
      FROM t 
      ORDER BY caseID ASC 
     ) AS t1 
  ) AS t2 
INNER JOIN t AS t3 
  ON t3.groupVarian = t2.groupVarian 
ORDER BY t3.caseID ASC

另外:
我之前的模拟DENSE_RANK功能的尝试效果很好。尽管也可以对先前的查询进行一些微调以实现DENSE_RANK功能。但是,以下查询效率更高,因为它创建的
Derived表较少 ,并避免了 JOIN on groupVarian

SET @row_number = 1;
SET @group_varian = '';

SELECT inner_nest.caseID, 
       inner_nest.groupVarian, 
       CONCAT('v', inner_nest.num) as nameVarian 
FROM (
        SELECT 
            caseID, 
            @row_number:=CASE
                           WHEN @group_varian = groupVarian THEN @row_number
                           ELSE @row_number + 1
                         END AS num, 
            @group_varian:=groupVarian as groupVarian 
        FROM
            t  
        ORDER BY groupVarian
     ) AS inner_nest 
ORDER BY inner_nest.caseID ASC


 类似资料:
  • 问题内容: 是否有类似于C的Go功能,能够处理控制台中的Tab键?我想在控制台应用程序中完成一些工作。 问题答案: C的示例: 等效: 最后的注释行仅显示当您按下第一个元素时,是U + 0009(’CHARACTER TABULATION’)。 但是,由于您的需要(检测选项卡),C 并不适合,因为它需要用户按Enter键。您需要的是@miku提到的ncurses的getch()/ readline

  • 问题内容: 我正在尝试将一些Python代码移植到Scala。它大量使用了Numpy和Scipy。虽然我已经找到了许多密集矩阵/线性代数库,它们可以作为NumPy的适当替代品(但不是极好的替代品),但我还没有真正找到能够提供我在SciPy中使用的功能的东西。特别是,我正在寻找一个支持稀疏部分本征分解的库(例如SciPy对arpack的包装),然后再寻找SciPy提供的一些简单内容的库(例如直方图)

  • 框架:UNIAPP.先上图: 这是京东的订单评论功能,文本输入框在不选择标签时可正常输入评论,此时有几个标签可供用户选择,选择完标签后,另起一行,在文本框中出现带标签的文字(如图中箭头所示),可输入相关内容,再点击标签时提示请删除标签后内的内容。删除完内容后再按一次键盘上的删除键,整个标签被删除。 想问下这种功能是怎么实现的?

  • 本文向大家介绍有没有类似于MySQL中Oracle的trunc(sysdate)的功能?,包括了有没有类似于MySQL中Oracle的trunc(sysdate)的功能?的使用技巧和注意事项,需要的朋友参考一下 是的,您可以用于仅获取MySQL中的日期部分,并且可以用于获取MySQL中的当前日期。 当前日期如下- 让我们首先创建一个表- 使用插入命令在表中插入一些记录- 使用select语句显示表

  • 问题内容: 我正在寻找一种解决方案,可以从adb访问我们应用程序的内部状态以进行调试。我已经使用了dumpsys来获取系统服务的内部状态,所以现在我想知道是否可以将应用程序的接口公开到adb。到目前为止,我唯一想到的就是定期记录信息,然后只读取logcat,但如果可能的话,我希望能够通过adb直接与应用程序进行交互,因此问题是如何在我们的应用程序中实现此功能。 问题答案: 在您的覆盖方法中,例如:

  • 问题内容: 我想找到多列的最大值。 MySQL支持该GREATEST功能,但SQL Server不支持。 SQL Server 2008中是否有与此相似的功能? 问题答案: 否。但是子查询可以访问外部查询中的列,因此您可以添加一个子查询UNION ALL,将感兴趣的列作为派生表,然后从中进行选择max。 或像您在2008年时一样简洁的版本。