oracle选择一列依赖于第二列中两个值的行

oracle选择一列依赖于第二列中两个值的行,oracle,Oracle,我有用户竞购物品的数据(比如按asc时间排序): 我只需要选择这些用户,他们在竞标项目中失败。因此,对于项目_id=1:用户nr1因为用户nr2出价更高而丢失,然后用户nr2也因为用户nr1出价更高而丢失。对于此项目,SELECT应返回user_id=2 如何以智能方式选择所有此类用户?在此处用您的表名更改“出价” select t.item_id, t.user_id from ( select item_id, user_id from bids group b

我有用户竞购物品的数据(比如按asc时间排序):

我只需要选择这些用户,他们在竞标项目中失败。因此,对于项目_id=1:用户nr1因为用户nr2出价更高而丢失,然后用户nr2也因为用户nr1出价更高而丢失。对于此项目,SELECT应返回user_id=2

如何以智能方式选择所有此类用户?

在此处用您的表名更改“出价”

select  t.item_id, t.user_id  from (
    select item_id, user_id 
    from bids
    group by item_id, user_id 
) t
left join (select item_id, user_id from   bids   where win = 1 ) winners
ON
t.item_id = winners.item_id
AND
t.user_id = winners.user_id
WHERE 
winners.item_id IS NULL
在这里更改“出价”与您的表名

select  t.item_id, t.user_id  from (
    select item_id, user_id 
    from bids
    group by item_id, user_id 
) t
left join (select item_id, user_id from   bids   where win = 1 ) winners
ON
t.item_id = winners.item_id
AND
t.user_id = winners.user_id
WHERE 
winners.item_id IS NULL


我只需要选择在竞标项目中失败的这些用户
因此,如果有10个用户竞标,9个用户竞标失败,那么您需要选择所有这9个用户?是。除了那些输了,但最终赢了的用户(这很难)
我只需要选择这些用户,他们在竞标项目时输了
所以,如果有10个用户竞标,9个用户竞标失败,那么您需要选择这9个用户中的所有用户?是的。除了这些输了的人,但最后赢了(这是很难的)很好很干净的解决方案。答案应该是更好的,只是简单的解释而不是简单的询问。@ThorstenKettner-我同意你的一般观点;但是在这个特殊的例子中,解决方案就是这样一个基本的SQL语句,不需要任何解释。因此,这不是学习/教授前两天的基本SQL的地方。@ThorstenKettner我通常会这样做,但除了最简单的
分组方式和
中的
子句之外,没有必要使用任何其他方法,所以任何文本都只会说“您可以
列分组,并使用
HAVING
将其限制为那些没有获胜的人。“它只是复制了这个简单查询所说的内容,而不是使用英语句子,并且没有向解决方案中添加任何快速阅读代码所看不到的内容-因此它被忽略了。这个解决方案很聪明,谢谢!实际上,我认为HAVING子句会影响查询结束时的结果。在拥有之前没有“赢”的价值,那么这怎么能起作用呢?谢谢你,如果你能解释的话。@bry888你在问题中说有三列
项目id
win
用户id
。你问“在拥有之前没有“赢”的价值是什么意思,那么这怎么行?”?您在问题中指定了一个
win
列。非常好且干净的解决方案。答案应该是更好的,只是简单的解释而不是简单的询问。@ThorstenKettner-我同意你的一般观点;但是在这个特殊的例子中,解决方案就是这样一个基本的SQL语句,不需要任何解释。因此,这不是学习/教授前两天的基本SQL的地方。@ThorstenKettner我通常会这样做,但除了最简单的
分组方式和
中的
子句之外,没有必要使用任何其他方法,所以任何文本都只会说“您可以
列分组,并使用
HAVING
将其限制为那些没有获胜的人。“它只是复制了这个简单查询所说的内容,而不是使用英语句子,并且没有向解决方案中添加任何快速阅读代码所看不到的内容-因此它被忽略了。这个解决方案很聪明,谢谢!实际上,我认为HAVING子句会影响查询结束时的结果。在拥有之前没有“赢”的价值,那么这怎么能起作用呢?谢谢你,如果你能解释的话。@bry888你在问题中说有三列
项目id
win
用户id
。你问“在拥有之前没有“赢”的价值是什么意思,那么这怎么行?”?你在问题中指定了一个
win
列。对于这样一个简单的问题来说,太复杂和低效了。我尝试了这个,它看起来很合理/给出了很好的结果。对于这样一个简单的问题,我将在明天进行更为复杂和低效的测试。我尝试了这一个,它看起来很合理/给出了很好的结果。明天我会再测试一次
SELECT   item_id, user_id
FROM     your_table
GROUP BY item_id, user_id
HAVING   MAX( win ) = 0;