首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >怎样才能得到最近的成双成对呢?

怎样才能得到最近的成双成对呢?
EN

Stack Overflow用户
提问于 2019-07-09 13:14:22
回答 2查看 32关注 0票数 0

我有两个表,第二个表用多个条目(1:n)连接到第一个表。

第一个表包含id_something (另一个表,但目前不重要)和每天date_day的条目。

代码语言:javascript
复制
+-----------+
| Table ONE |
+----+------+-------+----------+----------+
| id | id_something | date_day | created  |
+----+--------------+----------+----------+
|  1 |          666 | 2019-1-1 | 2019-1-1 |
|  2 |          666 | 2019-1-1 | 2019-7-7 |
|  3 |          123 | 2019-1-1 | 2019-1-1 |
+----+--------------+----------+----------+

第二个表连接到这个id并包含键值对。

代码语言:javascript
复制
+-----------+
| Table TWO |
+--------+--+--+-----+
| id_one | foo | bar |
+--------+-----+-----+
|      1 |   1 |  20 |
|      1 |   2 |  21 |
|      2 |   1 |  30 |
|      2 |   2 |  31 |
|      2 |   3 |  32 |
|      3 |   1 |  10 |
+--------+-----+-----+

我想查询所有可能的连接,非常简单,它是一个连接:

代码语言:javascript
复制
SELECT *
FROM one
LEFT JOIN two
ON two.id_one = one.id;

+----+--------------+----------+----------+--------+-----+-----+
| id | id_something | date_day | created  | id_one | foo | bar |
+----+--------------+----------+----------+--------+-----+-----+
|  1 |          666 | 2019-1-1 | 2019-1-1 |      1 |   1 |  20 |
|  1 |          666 | 2019-1-1 | 2019-1-1 |      1 |   2 |  21 |
|  2 |          666 | 2019-1-1 | 2019-7-7 |      2 |   1 |  30 |
|  2 |          666 | 2019-1-1 | 2019-7-7 |      2 |   2 |  31 |
|  2 |          666 | 2019-1-1 | 2019-7-7 |      2 |   3 |  32 |
|  3 |          123 | 2019-1-1 | 2019-1-1 |      3 |   1 |  10 |
+----+--------------+----------+----------+--------+-----+-----+

现在,正如您所看到的,我还有一个created字段。id_somethingdate_day可能是相同的--但我只想拥有第二个表中最近的(created DESC)对。

因此,在这种情况下,查询应该返回:

代码语言:javascript
复制
+----+--------------+----------+----------+--------+-----+-----+
| id | id_something | date_day | created  | id_one | foo | bar |
+----+--------------+----------+----------+--------+-----+-----+
|  2 |          666 | 2019-1-1 | 2019-7-7 |      2 |   1 |  30 |
|  2 |          666 | 2019-1-1 | 2019-7-7 |      2 |   2 |  31 |
|  2 |          666 | 2019-1-1 | 2019-7-7 |      2 |   3 |  32 |
|  3 |          123 | 2019-1-1 | 2019-1-1 |      3 |   1 |  10 |
+----+--------------+----------+----------+--------+-----+-----+

但我不能让它起作用..。我试着使用不同的,甚至是子查询和用例构造,但是它要么不起作用,要么很不理想。组-by也不会返回每个连接对,而只返回表1中每一个id的一行。

为了实现我所希望的结果,我错过了什么?

(如果不使用Oracle专用的synthax,这将是一种奖励。)

EN

回答 2

Stack Overflow用户

发布于 2019-07-09 13:16:33

您可以使用分析函数:

代码语言:javascript
复制
SELECT *
FROM (SELECT o.* ROW_NUMBER() OVER (PARTITION BY id ORDER BY created DESC) as seqnum
      FROM one o
     ) o LEFT JOIN
     two t
     ON t.id_one = o.id
WHERE o.seqnum = 1;
票数 1
EN

Stack Overflow用户

发布于 2019-07-09 13:19:32

使用row_number(),获取最新的id_something,然后使用联接

代码语言:javascript
复制
select a.*,b.* from     
(
select *,
row_number()over(partition by id_something order by created desc) rn  from one
) a join two b ON b.id_one = a.id;
 where rn=1
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56953461

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档