mysql - 如何在一天内查找复合键的唯一行

标签 mysql sql hive

我有一个包含以下值的表。 t1 被视为 day1,小时值由连字符分隔。我想根据一天中最后一次出现的情况合并唯一对(即一天中的 p<1..n>、c<1..n>)。

id1, p1, c1, t1-1
id2, p1, c1, t1-2
id3, p2, c2, t1-2
id4, p3, c3, t1-3
id5, p1, c1, t1-4
id6, p2, c2, t1-4
id7, p1, c3, t1-4
id8, p2, c2, t1-5
id9, p2, c3, t1-5
id10, p2, c4, t1-5
id11, p2, c3, t1-6
id12, p1, c1, t2-1
id13, p1, c2, t2-1
id14, p2, c2, t2-3
id15, p2, c3, t2-3
id16, p1, c1, t2-4

输出应该是

id5, p1, c1, t1-4
id8, p2, c2, t1-5
id4, p3, c3, t1-3
id7, p1, c3, t1-4
id11, p2, c3, t1-6
id10, p2, c4, t1-5 
id16, p1, c1, t2-4
id13, p1, c2, t2-1
id14, p2, c2, t2-3
id15, p2, c3, t2-3

最佳答案

一种方法

SELECT id, p, c, t
  FROM
(
  SELECT id, p, c, t
    FROM table1
   ORDER BY t DESC
) q
 GROUP BY SUBSTRING_INDEX(t, '-', 1), p, c

输出:

|   ID |  P |  C |    T |
|------|----|----|------|
|  id5 | p1 | c1 | t1-4 |
|  id7 | p1 | c3 | t1-4 |
|  id8 | p2 | c2 | t1-5 |
| id11 | p2 | c3 | t1-6 |
| id10 | p2 | c4 | t1-5 |
|  id4 | p3 | c3 | t1-3 |
| id16 | p1 | c1 | t2-4 |
| id13 | p1 | c2 | t2-1 |
| id14 | p2 | c2 | t2-3 |
| id15 | p2 | c3 | t2-3 |

Here is a SQLFiddle demo


UPDATE: In Hive you can leverage analytic functions, specifically ROW_NUMBER()

SELECT id, p, c, t
 FROM
(
 SELECT id, p, c, t,
 ROW_NUMBER() OVER (PARTITION BY SUBSTR(t, 1, INSTR(t, '-') - 1), p, c ORDER BY t DESC) rnum
 FROM table1
) q
 WHERE rnum = 1

这是一个 SQLFiddle 演示。 它适用于 Oracle,但应该按原样在 Hive 中工作。

关于mysql - 如何在一天内查找复合键的唯一行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21372874/

相关文章:

php - 在 yii2 中重用和传递多个查询的正确方法

mysql - 使用mysql从UTC格式计算特定月份

hadoop - 如何配置MR作业中的 map 以批量执行?

hive - 在没有 Hadoop/HDFS 的情况下使用 hive Metastore 服务

mysql - 将 mysql 中的 2 个表与 MySQL 中的不同列名组合

php - 选择更新

mysql - 选择某一行,其中某些列从未使某些条件失败

mysql - 如何在MySQL中基于列搜索设置order by的优先级?

scala - 由 spark 编写的 Parquet 文件中的 Athena/Hive 时间戳

mysql - 改进了用于选择玩家玩过的游戏数量和赢得的游戏数量的 SQL 查询