2015-09-04 105 views
-2

当用户选择查看最近记录的选项时,我有要求显示最新记录。我有3个不同的表格,我可以从中获取数据并显示在屏幕上。仅显示最近记录

下面是创建的示例表。

Create table one(sealID integer,product_ser_num varchar2(20),create_time timestamp,status varchar2(10)); 


create table two(transID integer,formatID integer, formatStatus varchar,ctimeStamp timestamp,sealID integer); 

create table three(transID integer,fieldStatus varchar,fieldValue varchar,exctype varchar); 

我加入了3个表格,并在单个屏幕上显示结果。我想根据时间戳显示最近的记录。 请从3个不同的表中找到屏幕上的样本数据。

ProductSerialNumber formatID formatStatus fieldStatus TimeStamp 
ASD100    100  P    P  2015-09-03 10:30:22 
ASD100    200  p    P  2015-09-03 10:30:22 
ASD100    100  p    P  2015-09-03 10:22:11 
ASD100    200  p    P  2015-09-03 10:22:11 

我想显示由以上显示表,应该返回前两排,因为他们最近的记录时与时间戳列检查最近的记录。

请建议对下列查询进行哪些更改才能显示最近的记录。

SELECT transId,product_ser_num,status, to_char(timestamp, 'yyyy-mm-dd hh24:mi:ss') timestamp, 
         cnt 
        FROM (SELECT one.*, 
        row_number() over(ORDER BY 
        CASE    
        WHEN :orderDirection like '%asc%' THEN 
        CASE 
         WHEN :orderBy='product_ser_num' THEN product_ser_num, 
         WHEN :orderBy='status' THEN status 
         WHEN :orderBy='timestamp' THEN to_char(timestamp, 'yyyy-mm-dd hh24:mi:ss') 
          ELSE to_char(timestamp, 'yyyy-mm-dd hh24:mi:ss') 
        END 
           END ASC, 
            CASE 
        WHEN :orderDirection like '%desc%' THEN 
        CASE 
        WHEN :orderBy='product_ser_num' THEN product_ser_num, 
            WHEN :orderBy='status' THEN status 
            WHEN :orderBy='timestamp' THEN to_char(timestamp, 'yyyy-mm-dd hh24:mi:ss') 
            ELSE to_char(timestamp, 'yyyy-mm-dd hh24:mi:ss') 
            END   
           END DESC , transId ASC) line_number 
           FROM (select one_inner.*, COUNT(1) OVER() cnt 
        from (select two_tran.transaction_id, 
            one_res.product_serial_number productSerialNumber, 
            one_res.status status,from one one_res 
            left outer join two two_trans on two_trans.sealID = one_res.sealID 
            left outer join three three_flds on two_tran.transID = three_flds.transID and (three_flds.fieldStatus = 'P') 
+1

始终将您的Oracle数据库版本发布至4位小数位。并请张贴样本数据,不要张贴图片,它根本没有帮助。请发布创建和插入语句,并发布所需的输出。 –

+0

oracle10g是使用的版本。当我看到图像时,我想它会给出清晰的表格结构图。要求是显示最近的记录。 @lalith kumar B – scrit

+1

很难看到图像,也不可能从图像中复制文本。您可以准备[SQL小提琴](http://sqlfiddle.com/)或在问题中发布创建和插入语句。 –

回答

0

这个查询看起来非常庞大和复杂,所以这可能是过于简单化的东西:

添加一个条款,最终limit 3

+0

它不总是3records.please读取基于时间戳的问题。请参阅image1并阅读以下内容。 @collin Driscoll – scrit

0

我认为你需要做的是:

select 
    max(timestamp), engine_serial_number, formatID 
from 
< 
joins here 
> 
group by engine_serial_number, formatID 

这将基本上给你你想要的线条,但不是所有的元数据。

因此,你只需要re-join所有这一切与主要加入获取其余的信息(加入所有三列,engine serial number,formatID AND timestamp)。

这应该工作。

希望这会有所帮助!

+0

PS - 您可能想使用id列而不是时间戳来获得更好的性能。你只需要确保更高的时间戳肯定意味着更高的ID(通常应该)。 –

+0

但是,如果使用ID列,我应该如何根据时间戳知道它应该返回多少条记录。因为我的要求是返回我认为需要检查时间戳的最新记录。请建议。 @Mihai OvidiuDrăgoi – scrit

+1

使用时间戳,看看它返回。然后按我的建议使用id。应该没有区别。对不起,迟到了,我正在度假。 –

1

我不认为你正在寻找一个Top-n作为你的主题标题暗示的查询。

您似乎想按自定义顺序显示数据,就像您在第一张图片中显示的那样。你想要根据timestamp将三行组合在一起。

我已经准备了一个小的测试案例来证明行的客户订单:

SQL> WITH DATA(ID, num, datetime) AS(
    2 SELECT 10, 1001, SYSDATE  FROM dual UNION ALL 
    3 SELECT 10, 6009, SYSDATE  FROM dual UNION ALL 
    4 SELECT 10, 3951, SYSDATE  FROM dual UNION ALL 
    5 SELECT 10, 1001, SYSDATE -1 FROM dual UNION ALL 
    6 SELECT 10, 6009, SYSDATE -1 FROM dual UNION ALL 
    7 SELECT 10, 3951, SYSDATE -1 FROM dual 
    8 ) 
    9 SELECT ID, 
10 num, 
11 TO_CHAR(DATETIME, 'yyyy-mm-dd hh24:mi:ss') TIMESTAMP 
12 FROM 
13 (SELECT t.*, 
14  row_number() OVER(ORDER BY DATETIME DESC, 
15  CASE num 
16  WHEN 1001 
17  THEN 1 
18  WHEN 6009 
19  THEN 2 
20  WHEN 3951 
21  THEN 3 
22  END, num) rn 
23 FROM DATA t 
24 ); 

     ID  NUM TIMESTAMP 
---------- ---------- ------------------- 
     10  1001 2015-09-04 11:04:48 
     10  6009 2015-09-04 11:04:48 
     10  3951 2015-09-04 11:04:48 
     10  1001 2015-09-03 11:04:48 
     10  6009 2015-09-03 11:04:48 
     10  3951 2015-09-03 11:04:48 

6 rows selected. 

现在,你可以看到,在相同ID10NUM值进行分组,并以自定义顺序。

+0

我不想根据时间戳定制订单或组合。我已经编写逻辑以降序显示记录。我唯一的要求是只显示最近的记录,而不是显示所有的记录。而且因为我的数据库查询对于连接和嵌套查询来说太大了,所以我不知道如何继续以及在哪个块中需要给出条件来实现这一点。请建议,感谢您的帮助,谢谢。@ lalit Kumasi B – scrit

+0

@scrit您的查询太大,无法通过查看来进行调查。你能否按照确切的要求进行精确定位并发布样本数据,就像我使用WITH子句发布一样。 –

+0

请参阅修改后的代码。我简化了它并添加了数据库查询。请建议。谢谢。 – scrit

0

很难给你一个确切的答案,因为你的查询是不完整的。但是我会给你一个总体思路,并且可以将它调整到你的查询中。

之一来完成你想要什么样的方式是通过使用dense_rank()分析功能的降序排列时间戳号码您行(你可以在这种情况下使用rank()过,它实际上并没有此事)。具有相同时间戳的所有行将被分配相同的“等级”,因此您可以按等级过滤仅获取最近的记录。

尝试查询调整到这样的事情:

select ... 
    from (select ..., 
       dense_rank() over (order by timestamp desc) as timestamp_rank 
      from ...) 
where timestamp_rank = 1 
... 

我怀疑有更好的了解你的数据模型和查询的,有可能会是一个更好的解决方案。但根据所提供的信息,我认为上述应该会产生您正在寻找的结果。

+0

它不是显示2行...请参阅显示的示例数据中的时间戳列。它应该返回最近的记录,因为前两个记录在同一时间,它们是最近的记录,它应该返回这两行。因此,如果在同一时间戳上有n个记录,那么如果它们是最新记录,那么我的查询应返回n个记录。谢谢。 @sstan – scrit

+0

@scrit:您的需求是否根据':orderBy'和':orderDirection'的值来更改?或者你总是希望通过时间戳记?另外,请修复您发布的查询。目前尚不完整。 – sstan

+0

我总是希望返回可以使用表1中的时间戳列获取的最新记录数据。请建议..谢谢。我会尽力解决我发布的查询。 @sstan。 – scrit