【问题标题】:Removing duplicates from one column only仅从一列中删除重复项
【发布时间】:2016-06-04 19:48:35
【问题描述】:

所以我会有这样的东西。它的结果是查询到两个表。

+------------------+------------------------------------+
| character_name   | title                              |
+------------------+------------------------------------+
| derp             | a                                  |
| derp             | b                                  |
| derp             | c                                  | 
| herp             | a                                  |
| herp             | b                                  |
| herp             | c                                  |
+-------------------------------------------------------+

我想要这个

+------------------+------------------------------------+
| character_name   | title                              |
+------------------+------------------------------------+
| derp             | a                                  |
|                  | b                                  |
|                  | c                                  | 
| herp             | a                                  |
|                  | b                                  |
|                  | c                                  |
+-------------------------------------------------------+

这可能吗?

【问题讨论】:

标签: mysql sql database


【解决方案1】:

这是你的意思吗?

select case when i.rnk = 1 THEN i.character_name  ELSE '' END as NAME
, i.title
from(
    select *
    , row_number() over (partition by character_name order by title) as rnk
    from t1
) i
order by i.character_name 

名字将获得值 1,您会在结果中显示该值,而您隐藏的任何其他内容。

更新 - MySql 版本

SET @r_name:='';

select name, title FROM (
    select @r_name:=CASE WHEN @r_name = name THEN '' 
    ELSE name
    END AS name
    , @r_name:=name
    , title
    FROM
    t1
) t2

【讨论】:

  • 这个查询是针对mysql的?!
  • @ashkufaraz 我没有注意标签,我已经添加了更新,谢谢。
【解决方案2】:

您可以在用户变量的帮助下完成。

SQL:

SET @last_name = '';
SELECT
    IF(switch_name, tbl2.character_name, '') character_name,
    tbl2.title
FROM
    (
    SELECT 
        character_name, 
        title, 
        character_name != @last_name switch_name, 
        @last_name:=character_name 
    FROM
        tbl
    ) tbl2;

结果:

mysql> SELECT character_name, title FROM tbl;
+----------------+-------+
| character_name | title |
+----------------+-------+
| derp           | a     |
| derp           | b     |
| derp           | c     |
| herp           | a     |
| herp           | b     |
| herp           | c     |
+----------------+-------+
6 rows in set (0.00 sec)

mysql> SET @last_name = '';
Query OK, 0 rows affected (0.00 sec)

mysql>
mysql> SELECT
    ->     IF(switch_name, tbl2.character_name, '') character_name,
    ->     tbl2.title
    -> FROM
    ->     (
    ->     SELECT
    ->         character_name,
    ->         title,
    ->         character_name != @last_name switch_name,
    ->         @last_name:=character_name
    ->     FROM
    ->         tbl
    ->     ) tbl2;
+----------------+-------+
| character_name | title |
+----------------+-------+
| derp           | a     |
|                | b     |
|                | c     |
| herp           | a     |
|                | b     |
|                | c     |
+----------------+-------+
6 rows in set (0.00 sec)

【讨论】:

    【解决方案3】:

    它将适用于您给定的表格

       SELECT CASE  
        WHEN character_name ='derp' AND title ='a' THEN 'derp'
        WHEN character_name ='derp' AND title ='b' THEN ''
        WHEN character_name ='derp' AND title ='c' THEN ''
        WHEN character_name ='herp' AND title ='a' THEN 'herp'
        WHEN character_name ='herp' AND title ='b' THEN ''
        WHEN character_name ='herp' AND title ='c' THEN ''
        end as character_name,
        title
        from table_name;
    

    注意:如果您的数据是动态的或不是如上所示,那么您必须重写/优化查询以获得所需的结果。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-01-05
      • 1970-01-01
      • 2015-09-30
      • 2020-03-16
      • 2014-09-30
      • 1970-01-01
      • 1970-01-01
      • 2014-03-10
      相关资源
      最近更新 更多