Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/google-app-engine/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 按语句分组不';行不通_Sql_Oracle_Group By - Fatal编程技术网

Sql 按语句分组不';行不通

Sql 按语句分组不';行不通,sql,oracle,group-by,Sql,Oracle,Group By,因此,目前我有下表: ID, Name, Code, Date 1 AB x1 01/03/2014 1 AB x2 01/04/2014 1 AB x3 01/05/2014 2 BC x3 01/05/2014 2 BC x5 01/06/2014 3 CD x1 01/06/2014 我想要以下输出: ID, Name, Code, Date 1 AB x3 01

因此,目前我有下表:

ID, Name, Code, Date
1   AB    x1     01/03/2014
1   AB    x2     01/04/2014
1   AB    x3     01/05/2014
2   BC    x3     01/05/2014
2   BC    x5     01/06/2014
3   CD    x1     01/06/2014
我想要以下输出:

ID, Name, Code, Date
1   AB    x3     01/05/2014
2   BC    x5     01/06/2014
3   CD    x1     01/06/2014
所以基本上,我只想要最新的日期,而不关心代码

在我的代码中,我有

select id, name, code, max(date)
group by id, name, code
但是groupby不起作用,因为它还将考虑代码,因此我不知道最新的日期。另外,我不能将代码留在GROUPBY语句中,因为它会给我一个错误

如何在不包含代码的情况下使用group by?
我使用PL/sqldeveloper作为IDE。

我假设您希望获得具有最大日期的行上的任何代码。如果您真的不关心返回的代码是什么,只需对其使用聚合函数,如max(code)

否则,您可以执行以下操作:

SELECT t1.id, t1.name, t2.code, t2.date
FROM MyTable t1
CROSS JOIN (
  SELECT TOP 1 code, date
  FROM MyTable t3
  WHERE t3.id=t1.id
  AND t3.name=t1.name
  ORDER BY t3.date DESC
) t2

我不确定交叉连接是否与PL/SQL兼容,但我确定您可以找到等效的连接。

我假设您希望获得包含最大日期的行上的任何代码。如果您真的不关心返回的代码是什么,只需对其使用聚合函数,如max(code)

select id, name, code, date
from (
  select id, name, code, 
         date,
         max(date) over (partition by id) as max_date
  from the_table
) 
where date = max_date;
否则,您可以执行以下操作:

SELECT t1.id, t1.name, t2.code, t2.date
FROM MyTable t1
CROSS JOIN (
  SELECT TOP 1 code, date
  FROM MyTable t3
  WHERE t3.id=t1.id
  AND t3.name=t1.name
  ORDER BY t3.date DESC
) t2

我不确定交叉连接是否与PL/SQL兼容,但我确定您可以找到等效的连接。

我假设您希望获得包含最大日期的行上的任何代码。如果您真的不关心返回的代码是什么,只需对其使用聚合函数,如max(code)

select id, name, code, date
from (
  select id, name, code, 
         date,
         max(date) over (partition by id) as max_date
  from the_table
) 
where date = max_date;
否则,您可以执行以下操作:

SELECT t1.id, t1.name, t2.code, t2.date
FROM MyTable t1
CROSS JOIN (
  SELECT TOP 1 code, date
  FROM MyTable t3
  WHERE t3.id=t1.id
  AND t3.name=t1.name
  ORDER BY t3.date DESC
) t2

我不确定交叉连接是否与PL/SQL兼容,但我确定您可以找到等效的连接。

我假设您希望获得包含最大日期的行上的任何代码。如果您真的不关心返回的代码是什么,只需对其使用聚合函数,如max(code)

select id, name, code, date
from (
  select id, name, code, 
         date,
         max(date) over (partition by id) as max_date
  from the_table
) 
where date = max_date;
否则,您可以执行以下操作:

SELECT t1.id, t1.name, t2.code, t2.date
FROM MyTable t1
CROSS JOIN (
  SELECT TOP 1 code, date
  FROM MyTable t3
  WHERE t3.id=t1.id
  AND t3.name=t1.name
  ORDER BY t3.date DESC
) t2
我不确定交叉连接是否与PL/SQL兼容,但我确信您可以找到等效的连接

select id, name, code, date
from (
  select id, name, code, 
         date,
         max(date) over (partition by id) as max_date
  from the_table
) 
where date = max_date;
如果要在存在多个“最大日期”的情况下选择其中一个日期,则可以使用
行号()

select id, name, code, date
from (
  select id, name, code, 
         date,
         row_number() over (partition by id order by date desc) as rn
  from the_table
) 
where rn = 1;

顺便说一句:
date
是一个可怕的列名称。一方面,因为它也是数据类型的名称,但更重要的是,它根本不记录列包含的内容。“结束日期”?“开始日期”?“到期日”

如果要在存在多个“最大日期”的情况下选择其中一个日期,则可以使用
行号()

select id, name, code, date
from (
  select id, name, code, 
         date,
         row_number() over (partition by id order by date desc) as rn
  from the_table
) 
where rn = 1;

顺便说一句:
date
是一个可怕的列名称。一方面,因为它也是数据类型的名称,但更重要的是,它根本不记录列包含的内容。“结束日期”?“开始日期”?“到期日”

如果要在存在多个“最大日期”的情况下选择其中一个日期,则可以使用
行号()

select id, name, code, date
from (
  select id, name, code, 
         date,
         row_number() over (partition by id order by date desc) as rn
  from the_table
) 
where rn = 1;

顺便说一句:
date
是一个可怕的列名称。一方面,因为它也是数据类型的名称,但更重要的是,它根本不记录列包含的内容。“结束日期”?“开始日期”?“到期日”

如果要在存在多个“最大日期”的情况下选择其中一个日期,则可以使用
行号()

select id, name, code, date
from (
  select id, name, code, 
         date,
         row_number() over (partition by id order by date desc) as rn
  from the_table
) 
where rn = 1;


顺便说一句:
date
是一个可怕的列名称。一方面,因为它也是数据类型的名称,但更重要的是,它根本不记录列包含的内容。“结束日期”?“开始日期”?“到期日”

您想要的是最新更新的记录,对吗

select t1.* 
from table t1 
inner join (select id, name, max(date) as latest_date
            from table
            group by id, name) t2 on t1.date = t2.latest_date 
            and t1.id = t2.id and t1.name = t2.name

最好在日期列上有索引

您想要的是最新更新的记录,对吗

select t1.* 
from table t1 
inner join (select id, name, max(date) as latest_date
            from table
            group by id, name) t2 on t1.date = t2.latest_date 
            and t1.id = t2.id and t1.name = t2.name

最好在日期列上有索引

您想要的是最新更新的记录,对吗

select t1.* 
from table t1 
inner join (select id, name, max(date) as latest_date
            from table
            group by id, name) t2 on t1.date = t2.latest_date 
            and t1.id = t2.id and t1.name = t2.name

最好在日期列上有索引

您想要的是最新更新的记录,对吗

select t1.* 
from table t1 
inner join (select id, name, max(date) as latest_date
            from table
            group by id, name) t2 on t1.date = t2.latest_date 
            and t1.id = t2.id and t1.name = t2.name


最好在日期列上有索引

如果有多条记录的最大日期相同,您希望得到什么?如果有多条记录的最大日期相同,您希望得到什么?如果有多条记录的最大日期相同,您希望得到什么?如果有多条记录的最大日期相同,您希望得到什么?Oracle确实支持交叉联接——但交叉联接在这里没有任何意义。定期加入会更好。但是Oracle不支持
top
,并且您的代码中没有PL/SQL。交叉连接绝对有意义,因为OP没有提供唯一的连接键。如果没有唯一键,常规联接可能会产生多行。“Row_Number()OVER(Partition By…”是PL/SQL吗?它看起来很像TSQL。我承认我没有使用Oracle,所以我提供了我所知道的最好的ANSI SQL答案。
Row_Number()
是一个所谓的“窗口函数”,是ANSI SQL。它从版本8开始在Oracle中可用(还有许多其他DBMS也支持这一点——事实上SQL Server在那个聚会上已经很晚了)如果不使用窗口函数,则会是更好的选择。不一定是出于性能原因,而是为了清晰起见。Oracle中的PL/SQL严格用于存储过程。任何不以
declare
begin
开头的都不是PL/SQL。Faraz的答案绝对不起作用,因为可能有多行具有相同的名称/id/date组合,因此结果集可能包含比预期/期望的更多的行是可用的,我同意这是最好的解决方案。Oracle确实支持
交叉连接
-但是交叉连接在这里没有任何意义。常规连接会更好。但是Oracle不支持
top
,并且您的代码中没有PL/SQL。交叉连接绝对有意义,因为OP没有提供唯一的键来连接。W如果没有唯一的键,常规联接可能会产生多行。那么“Row_Number()OVER(Partition By…”是PL/SQL吗?它看起来很像TSQL。我承认我不使用Oracle,所以我提供了我所知道的最好的ANSI SQL答案。
Row_Number()
是一个所谓的“窗口函数”,我