簡體   English   中英

如何僅獲取最近加入的配對?

[英]How to get only the recent joined pairs?

我有兩個表,其中第二個表通過多個條目( 1:n )連接到第一個表。

第一個表具有id_something (另一個表,但目前不重要)和每天date_day條目。

+-----------+
| 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連接,並且包含鍵值對。

+-----------+
| Table TWO |
+--------+--+--+-----+
| id_one | foo | bar |
+--------+-----+-----+
|      1 |   1 |  20 |
|      1 |   2 |  21 |
|      2 |   1 |  30 |
|      2 |   2 |  31 |
|      2 |   3 |  32 |
|      3 |   1 |  10 |
+--------+-----+-----+

我想查詢所有可能的連接,很簡單,這是一個JOIN:

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 )對。

因此,在這種情況下,查詢應返回:

+----+--------------+----------+----------+--------+-----+-----+
| 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 |
+----+--------------+----------+----------+--------+-----+-----+

但是我無法使其工作...我試圖使用DISTINCT或什至子查詢和case構造,但是它要么不起作用,要么非常不合適。 group-by也不會返回每個加入的對,而對於表一中的每個id只返回一行。

我錯過了什么才能達到理想的結果?

(如果不使用特定於Oracle的synthax,那將是一個好處。)

您可以使用分析功能:

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;

使用row_number()獲取最新的id_something,然后使用join

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM