【问题标题】:Select multiple distinct rows选择多个不同的行
【发布时间】:2022-11-01 21:59:05
【问题描述】:

我有一张包含以下数据的表格。

id country serial other_column
1  us      123    1
2  us      456    1
3  gb      123    1
4  gb      456    1
5  jp      777    1
6  jp      888    1

7  us      123    2
8  us      456    3
9  gb      456    4
10  us     123    1
11  us     123    1

有没有办法为每个唯一的国家和唯一的序列获取 2 行?

例如,期望从我的查询中得到以下结果。

us,123,1 来了两次,因为有 3 个相同类型,我想要每个唯一国家和唯一序列 2 行。

us,123,1
us,123,1 
us,456,1
gb,123,1
gb,456,1
jp,777,1
jp,888,1

我不能使用:

select distinct country, serial from my_table; 

因为我想要国家和序列的每个不同值匹配 2 行。请建议。

【问题讨论】:

  • 您使用什么标准来表示“每个唯一国家/地区和唯一序列 2 行”? ID #?序列号#ASC/DESC?等等如果有超过2个怎么办?什么留下,什么去?
  • @GRIV 可以是 ASC/DESC,没关系。如果 locale + serial 像我们 + 123 一样出现一次,这是独一无二的。我想捕获两次这种情况。所以应该打印我们,123 两次。 (我想捕获整行而不仅仅是这两个值)
  • 我仍然有点困惑,回到我上面的评论: ID #7 with us/123/2 is not shown but ID #1 with us/123/1 is shown?为什么值为 1 的“other_column”返回与 2?您的订购必须有一些逻辑。
  • 如果你有我们, 123, 1 和我们 123, 1 和我们, 123, 2 你想要哪一个?什么是逻辑
  • @trillion us, 123, 1 和我们, 123, 1 很好。还有很多列。因此最终会得到我们,123,1,a,b,c 和 us,123,1,d,e,f 这就是我想要的。每个唯一国家/地区 + 系列 2 行。

标签: sql hive


【解决方案1】:

使用CTEsubqueryDENSE_RANKROW_NUMBER 分配给您的数据集,然后返回ROW_NUMBER 小于3DENSE_RANK 等于1 的行。此外,由于您没有指定ORDERING,我添加了一个自定义ORDER BY 来处理您的Country 排序以匹配您想要的上述输出。

SELECT
  ID,
  Country, 
  Serial, 
  other_column
FROM 
  (SELECT 
   *,
  ROW_NUMBER() OVER (PARTITION BY Country, Serial ORDER BY Country, Serial, other_column) AS RN,
  DENSE_RANK() OVER (PARTITION BY Country, Serial ORDER BY Country, Serial, other_column) AS DR
FROM my_table) A
  WHERE RN < 3 AND DR = 1
ORDER BY CASE WHEN Country = 'us' THEN 1
              WHEN country = 'gb' THEN 2
              WHEN country = 'jp' THEN 3
              ELSE 4
         END ASC, Country, Serial, other_column, ID

结果:

| ID | Country | Serial | other_column  |
|----|---------|--------|---------------|
| 1  | us      | 123    | 1             |
| 10 | us      | 123    | 1             |
| 2  | us      | 456    | 1             |
| 3  | gb      | 123    | 1             |
| 4  | gb      | 456    | 1             |
| 5  | jp      | 777    | 1             |
| 6  | jp      | 888    | 1             |

小提琴here

【讨论】:

    猜你喜欢
    • 2013-03-29
    • 2021-04-09
    • 2018-07-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多