【问题标题】:How to select distinct records from individual column in sql table如何从 sql 表中的单个列中选择不同的记录
【发布时间】:2014-11-15 05:18:46
【问题描述】:

我想从这个 sql 表的每一列中检索不同的行

我的桌子

1    Apple
2    Banana
3    Apple
2    Apple
1    Orange

我想要这样的结果:

1   Apple
2   Banana
3   Orange

请帮我解决这个问题

【问题讨论】:

  • 你试过SELECT DISTINCT吗?
  • 在每一列上尝试SELECT DISTINCT。您将获得 2 个结果集。然后执行 UNION ALLFULL OUTER JOIN 将 2 个结果集合并为 1 个。
  • 我已经尝试从数据联合中选择不同的 [名字] 所有从数据中选择不同的 [姓氏] ---- 但结果出现在单列(“名字”)中......我想要结果在两列中
  • 您需要解释这背后的逻辑——从原始数据到结果,您想做什么?这背后的想法/规则是什么?不要只是将两组数据转储给我们,让我们想知道这里可能发生了什么!

标签: sql datatable distinct


【解决方案1】:

您可以通过以下方式获得不同的名称:

select distinct name
from table t;

您可以通过以下方式添加第一列:

select row_number() over (order by name) as id, name
from (select distinct name
      from table t
     ) t;

大多数数据库都支持 ANSI 标准行号。你没有用数据库标记这个,所以这是最通用的解决方案。

编辑:

哦,你想要两列,每列都有值。我会以full outer join 来处理这个问题:

select nu.num, na.name
from (select num, row_number() over (order by num) as seqnum
      from table
      group by num
     ) nu full outer join
     (select name, row_number() over (order by name) as seqnum
      from table t
      group by name
     ) na
     on nu.seqnum = na.seqnum;

每个子查询都会枚举每一列中的值。 full outer join 确保您拥有价值,即使它们在一侧或另一侧缺失。

【讨论】:

  • 您将如何实际从 OP 的第一列检索数据,并朝着要求的结果努力?以及如何满足各个列中不同数量的条目?
  • 阿贝西。 . .我懂了。我想我最初误解了这个问题,但添加了另一个答案。我仍然不知道哪种解释是正确的(注意标题使用单数形式的“列”)。
  • GordonLinoff - 建议编辑从select (select 中删除select (outer join 的第二部分(以及未使用的t 别名)被拒绝...
  • @Abecee 。 . .谢谢。
【解决方案2】:

请尝试一下

select *,row=rank() over(order by name) from  (SELECT distinct name FROM abc) as cte 

with cte as
(
    SELECT distinct name FROM abc
) 
select *,row=rank() over(order by name) from cte 

输出

| row       | Name |
|-----------|----------|
|         1 |    Apple |
|         2 |   Banana |
|         3 |   Orange |

【讨论】:

  • 我可以知道什么是cte
  • cte 是临时表,我们只能在运行时将值存储在这个表中
【解决方案3】:

概念证明。
在 Oracle 11.2 上测试

WITH
MyTable (firstName, lastName) AS (
  SELECT '1', 'Apple' FROM DUAL UNION ALL
  SELECT '2', 'Banana' FROM DUAL UNION ALL
  SELECT '3', 'Apple' FROM DUAL UNION ALL
  SELECT '2', 'Apple' FROM DUAL UNION ALL
  SELECT '4', 'Apple' FROM DUAL UNION ALL
  SELECT '1', 'Orange' FROM DUAL),
Ranked AS (
  SELECT DISTINCT
    firstName
    , DENSE_RANK() OVER (ORDER BY firstName) AS fnRnk
    , lastName
    , DENSE_RANK() OVER (ORDER BY lastName) AS lnRnk
  FROM MyTable  
)
SELECT
  DISTINCT R1.firstName, R2.lastName FROM Ranked R1 FULL OUTER JOIN Ranked R2 ON R1.fnRnk = R2.lnRnk ORDER BY lastName NULLS LAST, firstName
;

返回

| FIRSTNAME | LASTNAME |
|-----------|----------|
|         1 |    Apple |
|         2 |   Banana |
|         3 |   Orange |
|         4 |   (null) |

在原始数据中增加一行来展示不同长度的列。

SQL Fiddle

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-09-04
    • 2011-10-31
    • 2019-05-02
    • 2019-03-22
    • 1970-01-01
    • 2019-04-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多