我有一个包含以下值的表。 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/