假设我在一个表中有这样的数据:
Trade Id | Source
-----------------
x | LCH
x | Commodore
y | LCH
z | Commodore我想要这样的输出:
x | LCH
y | LCH
z | Commodore这意味着如果给定的交易id有任何"LCH“条目,则优先使用该条目。
在Java或任何其他编程语言中,我可以很容易地做到这一点,方法是在连接表之后获得基本结果,然后使用map等进行过滤,但出于性能原因,我们希望首先使用查询。
请您看一看,如果有SQL语言的解决方案,请告诉我。
发布于 2015-05-14 14:44:22
我们必须遵循分而治之的逻辑。
让我们先用source = 'LCH'显示所有的trade_id
SELECT Trade_id,Source
FROM your_table
WHERE Source='LCH'现在,我们必须提取其他没有LCH源的trade_id!在这里,我使用NOT EXISTS来做同样的事情。
SELECT Trade_id,Source
FROM your_table a
WHERE NOT EXISTS
(SELECT 'X' FROM your_table b
WHERE a.Trade_id = b.Trade_id
AND b.Source = 'LCH')现在我们已经提取了我们想要的所有行,所以我们对两个结果集进行UNION (集合操作)。
SELECT Trade_id,Source
FROM your_table
WHERE Source='LCH'
UNION ALL
SELECT Trade_id,Source
FROM your_table a
WHERE NOT EXISTS
(SELECT 'X' FROM your_table b
WHERE a.Trade_id = b.Trade_id
AND b.Source = 'LCH')发布于 2015-05-14 15:49:57
这是一个窗口聚合函数的任务,不需要连接:
SELECT Trade_id, Source
FROM
(
SELECT Trade_id, Source,
ROW_NUMBER()
OVER (PARTITION BY Trade_id
ODER BY CASE WHEN Source = 'LCH' THEN 0 ELSE 1 END) AS rn
FROM your_table
) AS dt
WHERE rn = 1发布于 2015-05-14 14:44:53
试试这个:
select * from table where source = 'LCH'
Union
select * from table where source <> 'LCH' and trade_id not in (select * from table where source = 'LCH'
)https://stackoverflow.com/questions/30230894
复制相似问题