Sql Oracle 11g-从小时列大于的集合中排除记录

Sql Oracle 11g-从小时列大于的集合中排除记录,sql,oracle11g,Sql,Oracle11g,考虑以下最小的示例: SQL> select key1, key2, key3, hour from teste_jm; KEY1 KEY2 KEY3 HOUR ---------- ---------- ---------- ----- 26 992296089 1504 12:30 26 992296089 1275 13:30 我想排除KEY3为1275的记录,因为它的小时数大于KEY

考虑以下最小的示例:

SQL> select key1, key2, key3, hour from teste_jm;

      KEY1       KEY2       KEY3 HOUR
---------- ---------- ---------- -----
        26  992296089       1504 12:30
        26  992296089       1275 13:30
我想排除KEY3为1275的记录,因为它的小时数大于KEY3为1504的记录的小时数

我尝试了以下方法,但没有成功(我希望KEY4是1504):

因此,基本上,在Oracle 11g中,我想做的是只为同一个KEY1、KEY2对保存时间最早的记录

我该怎么做

编辑:下面是一个更完整的示例:

SQL> select * from teste_jm;

      KEY1       KEY2       KEY3 HOUR
---------- ---------- ---------- -----
        27  993334444          1 23:00
        27  993334444          2 23:59
        26  992296089       1504 12:30
        26  992296089       1275 13:30
上述各项的预期输出:

      KEY1       KEY2       KEY3 HOUR
---------- ---------- ---------- -----
        27  993334444          1 23:00
        26  992296089       1504 12:30
SQLFIDLE包含示例数据。

尝试执行此操作

select key1, key2, key3, hour from teste_jm where hour = (select min(hour) from teste_jm);
嗯,编辑完后,试试这个

select key1, key2, key3, min(hour) OVER (PARTITION BY  key1,key2) from teste_jm;
试着这样做

select key1, key2, key3, hour from teste_jm where hour = (select min(hour) from teste_jm);
嗯,编辑完后,试试这个

select key1, key2, key3, min(hour) OVER (PARTITION BY  key1,key2) from teste_jm;

你为什么不分组并获取最小值,我希望上面的输入与o/p示例是正确的,以便与下面的查询同步

     Select  KEY1, KEY2 ,min(KEY3), HOUR 
     from table group by
          KEY1, KEY2
        having HOUR=min(HOUR)

你为什么不分组并获取最小值,我希望上面的输入与o/p示例是正确的,以便与下面的查询同步

     Select  KEY1, KEY2 ,min(KEY3), HOUR 
     from table group by
          KEY1, KEY2
        having HOUR=min(HOUR)

您很接近,但需要一个子查询进行筛选,并为最小值提供正确的逻辑:

select key1, key2, key3, hour
from (select key1, key2, key3, hour,
             min(to_date(hour, 'HH24:MI')) over (partition by key1) as min_hour
      from teste_jm
     )  t
where hour = min_hour;

您很接近,但需要一个子查询进行筛选,并为最小值提供正确的逻辑:

select key1, key2, key3, hour
from (select key1, key2, key3, hour,
             min(to_date(hour, 'HH24:MI')) over (partition by key1) as min_hour
      from teste_jm
     )  t
where hour = min_hour;

很抱歉,这不会产生我想要的输出;请参阅上面的“更完整的示例”,我希望返回2条记录。我很抱歉没有早点说清楚。嗯,你的第二个答案是。。。有点接近?我实际上想选择某种MIN(键3)而不是MIN(小时)。。。除了为了确定最小值是多少,我希望使用HOUR列。希望这是有意义的。你只需要在have子句中有一个条件,因为minhour的键检查我的答案对不起,但这并不能产生我想要的输出;请参阅上面的“更完整的示例”,我希望返回2条记录。我很抱歉没有早点说清楚。嗯,你的第二个答案是。。。有点接近?我实际上想选择某种MIN(键3)而不是MIN(小时)。。。除了为了确定最小值是多少,我希望使用HOUR列。希望这是有意义的。你只需要在子句中有一个条件,因为那些最短时间的键检查我的答案,结果。。。ORA-00979:不是通过表达式分组检查现在应该可以了。我刚才看到有多个键3,就是这样,它在工作,直到不工作。不是一个由表达式组成的组。我在我的原始帖子中添加了一个SQLFiddle链接,这样你就可以查看了。。。ORA-00979:不是通过表达式分组检查现在应该可以了。我刚才看到有多个键3,就是这样,它在工作,直到不工作。不是一个由表达式组成的组。我在我原来的帖子中添加了一个SQLFiddle链接,这样你就可以查看了。看起来不错,谢谢。只是一个小小的更正:“hour”是HH24:MI格式的VARCHAR2(5)列;因此,子查询应该分别包含
to_date(hour,'HH24:MI')
min(to_date(hour,'HH24:MI'))
,而不是
hour
min(hour)
。除此之外,你的答案似乎还可以。似乎有效,谢谢。只是一个小小的更正:“hour”是HH24:MI格式的VARCHAR2(5)列;因此,子查询应该分别包含
to_date(hour,'HH24:MI')
min(to_date(hour,'HH24:MI'))
,而不是
hour
min(hour)
。除此之外,你的答案似乎还可以。