令人困惑的SELECT语句

时间:2011-03-01 20:09:59

标签: sql oracle select

首先,我将向您展示我的问题所涉及的示例表,然后我会问这个问题。

[my_fruits]
fruit_name   |   fruit_id   | fruit_owner   |   fruit_timestamp
----------------------------------------------------------------
Banana       |   3          |  Timmy        |   3/4/11
Banana       |   3          |  Timmy        |   4/1/11
Banana       |   8          |  Timmy        |   5/2/11
Apple        |   4          |  Timmy        |   2/1/11
Apple        |   4          |  Roger        |   3/4/11

现在我想运行一个只选择fruit_name,fruit_id和fruit_owner值的查询。我只希望每个水果获得一排,我希望它的确定方式是最新的时间戳。例如,此表上的完美查询将返回:

[my_fruits]
fruit_name   |   fruit_id   | fruit_owner   |
----------------------------------------------
Banana       |   8          |  Timmy        |
Apple        |   4          |  Roger        | 

我尝试了查询:

select max(my_fruits.fruit_name) keep 
    (dense_rank last order by my_fruits.fruit_timestamp) fruit_name,
       my_fruits.fruit_id, my_fruits.fruit_owner 
from my_fruits 
group by my_fruits.fruit_id, my_fruits.fruit_owner

现在问题就是返回基本上不同的水果名称,水果ID和水果所有者。

4 个答案:

答案 0 :(得分:3)

对于Oracle 9i +,请使用:

SELECT x.fruit_name,
       x.fruit_id,
       x.fruit_owner
  FROM (SELECT mf.fruit_name,
               mf.fruit_id,
               mf.fruit_owner,
               ROW_NUMBER() OVER (PARTITION BY mf.fruit_name
                                      ORDER BY mf.fruit_timestamp) AS rank
          FROM MY_FRUIT mf) x
 WHERE x.rank = 1

大多数数据库都支持在派生表/内联视图中使用自联接:

SELECT x.fruit_name,
       x.fruit_id,
       x.fruit_owner
  FROM MY_FRUIT x
  JOIN (SELECT t.fruit_name,
               MAX(t.fruit_timestamp) AS max_ts
          FROM MY_FRUIT t
      GROUP BY t.fruit_name) y ON y.fruit_name = x.fruit_name
                              AND y.max_ts = x.fruit_timestamp

但是,如果有2个以上具有相同时间戳值的fruit_name记录,则会返回重复项。

答案 1 :(得分:2)

如果每个水果名称需要一行,则必须按fruit_name分组。

select fruit_name,
       max(my_fruits.fruit_id) keep 
          (dense_rank last order by my_fruits.fruit_timestamp) fruit_id,
       max(my_fruits.fruit_owner) keep 
          (dense_rank last order by my_fruits.fruit_timestamp) fruit_owner
from my_fruits 
group by my_fruits.fruit_name

你想如何处理抢七是一个单独的问题。

答案 2 :(得分:1)

尝试子查询:

select a.fruit_name, a.fruit_id, a.fruit_owner
from my_fruits a
where a.fruit_timestamp =
 (select max(b.fruit_timestamp)
  from my_fruits b
  where b.fruit_id = a.fruit_id)

答案 3 :(得分:0)

我会通过查找您感兴趣的(fruit_name,fruit_timestamp)列表,然后将该“table”与实际水果表分组并检索其他值来实现。

SELECT fruit_and_max_t.fruit_name, 
       my_fruits.fruit_id,
       my_fruits.fruit_owner
FROM my_fruits, 
  ( SELECT fruit_name, MAX(fruit_timestamp) AS max_timestamp
    FROM my_fruits
    GROUP BY fruit_name) AS fruit_and_max_t,
WHERE fruit_and_max_t.max_timestamp = my_fruits.fruit_timestamp
  AND fruit_and_max_t.fruit_name    = my_fruits.fruit_name

这假设表中没有多个条目具有相同的值(fruit_name,fruit_timestamp),即元组(对)充当唯一标识符。

相关问题