Oracle-从表中选择最新的不同记录

Oracle-从表中选择最新的不同记录,oracle,distinct,Oracle,Distinct,理论上这似乎很容易,但我就是无法理解 这是我的表格信息和数据 ID Heading Date Row_Num 1 Test 12-MAR-12 1 1 Test2 13-MAR-12 2 2 Test3 13-MAR-12 3 这是我的问题 select * from table1 where date <= :date order by dat

理论上这似乎很容易,但我就是无法理解

这是我的表格信息和数据

ID    Heading    Date         Row_Num
 1       Test    12-MAR-12          1
 1      Test2    13-MAR-12          2
 2      Test3    13-MAR-12          3
这是我的问题

select * from 
table1 
where date <= :date 
order by date desc
因此,我添加了一个独特的,但这并没有像预期的那样工作,因为我必须按每个列分组,这样做仍然会产生3个结果


关于如何实现我想要的结果,你有什么想法吗?

如果你只想要每个ID都有最新DT的行,你会想要

SELECT id,
       heading,
       dt
  FROM (SELECT id,
               heading,
               dt,
               ROW_NUMBER() OVER (PARTITION BY id
                                      ORDER BY dt desc) rnk
          FROM table1)
 WHERE rnk = 1

如果可能存在两行相同ID和DT的连接,您可能希望在ORDER BY分析函数中添加其他内容,以决定性地断开连接,而不是让Oracle任意断开连接。

您需要使用分析函数。row_number函数应该可以做到这一点

select *
from
(
    select 
        id,
        heading,
        date,
        row_number() over ( partition by id order by heading desc nulls last ) r
    from table1
)
where r = 1

分析函数可用于对结果集中的行执行分析和分组。在上面的示例中,内部select像往常一样查询表1。row_number函数将使用partition语句中提供的聚合将每一行与其他返回行进行比较,以生成一个数字。在本例中,我们按ID分组,按标题降序排序。外部select有一个where子句,用于过滤行数不为1的行。只运行内部选择,看看整个过程是如何进行的。

我可能误解了您想要实现的目标,但我认为您可以通过分组方式和子查询来实现,如下所示:

SELECT * 
FROM table1 
WHERE ID||date IN 
  (SELECT ID||MAX(date)
  FROM table1 
  WHERE date <= to_date('14-mar-12', 'DD-mon-YY') 
  GROUP BY ID
  );

这将为每个ID和日期提供一行,只要没有多行具有相同ID和相同日期。

在Oracle中,按ID分区的行数按标题DESC排序是否可行?简单的问题=是的,这仅在Oracle中可用。其他DBMS上可能有类似的版本,但我给你的语法是Oracle。@WillMarcouiller:如果我没有弄错的话,Oracle是第一个支持这种功能的DBMS。从第7版开始就有了,太好了,谢谢你通知我!我知道行数,但不知道过分区。。。我肯定会把它改成WHERE ID,SELECT ID中的date,MAXdate。。。而不是连接这些值。其他答案更可取的主要原因是它们只需要一次表扫描,而这需要2次。。。不起作用,它返回ORA-00920:无效的关系运算符。我希望能够在不连接值的情况下执行此操作,因此如果您知道如何操作,请让我知道。抱歉@Jake,我复制并粘贴了,它是select中id、日期的位置。。。。
SELECT * 
FROM table1 
WHERE ID||date IN 
  (SELECT ID||MAX(date)
  FROM table1 
  WHERE date <= to_date('14-mar-12', 'DD-mon-YY') 
  GROUP BY ID
  );