2015-07-03 23 views
2

我试图为每个帐户在表中标识最新的合并事务。该表中填充帐户合并,最新的合并交易是大merge_tx_id从另一个相关行的值分区

源表:

| merge_tx_id | merge_from_id | merge_to_id | 
|-------------|---------------|-------------| 
|   1 |   546 |   100 | 
|   2 |   789 |   802 | 
|   3 |   123 |   456 | 
|   33 |   456 |   123 | 
|   222 |   802 |   789 | 
|   333 |   123 |   456 | 

merge_tx_id IN(3,33,333)是基于merge_from_id同一账户或merge_to_id出现在另一行,在这个例子中,合并被执行,然后再次“未合并”。最新的ID应该是 '456'

| merge_tx_id | merge_from_id | merge_to_id | 
|-------------|---------------|-------------| 
|   3 |   123 |   456 | 
|   33 |   456 |   123 | 
|   333 |   123 |   456 | 

merge_tx_id IN(2222)的基础上,merge_from_id同一账户或merge_to_id出现在另一行,最新的是为 '789'

| merge_tx_id | merge_from_id | merge_to_id | 
|-------------|---------------|-------------| 
|   2 |   789 |   802 | 
|   222 |   802 |   789 | 

merge_tx_id (1)是不相关的任何其他行的,最新的ID是“100”

| merge_tx_id | merge_from_id | merge_to_id | 
|-------------|---------------|-------------| 
|   1 |   546 |   100 | 

我想我需要加入表与自身进行排名,但我不清楚如何,如果我能,执行它(第1栏或第2栏)的创作。

期望的结果是

| merge_tx_id | merge_from_id | merge_to_id | 
|-------------|---------------|-------------| 
|   1 |   546 |   100 | 
|   333 |   123 |   456 | 
|   222 |   802 |   789 | 

例如:http://sqlfiddle.com/#!3/9a94b6/11

回答

1

可以使用以下查询:

SELECT merge_tx_id, merge_from_id, merge_to_id 
FROM (
SELECT merge_tx_id, merge_from_id, merge_to_id, 
     ROW_NUMBER() OVER (PARTITION BY x.merge1, y.merge2 
          ORDER BY merge_tx_id DESC) AS rn 
FROM merge_grp 
CROSS APPLY (SELECT CASE WHEN merge_from_id < merge_to_id 
          THEN merge_from_id 
          ELSE merge_to_id 
        END AS merge1) AS x 
CROSS APPLY (SELECT CASE WHEN merge_from_id >= merge_to_id 
          THEN merge_from_id 
          ELSE merge_to_id 
         END AS merge2) AS y ) t 
WHERE t.rn = 1      

查询采用两个CROSS APPLY条款,以重新安排merge_from_idmerge_to_id作为两个等效列,merge1,merge2,它们是我n升序。 ROW_NUMBER使用这两个计算列来划分行,并因此使得能够选择具有每merge1,merge2的最大merge_tx_id的行。

Demo here

+0

例如哇伟大的工作---谢谢^ _^ –

+0

@bosco_taco快乐帮,欢迎堆栈溢出。如果此答案或任何其他人解决了您的问题,请将其标记为已接受。 –

相关问题