Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.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_Oracle11g_Group By_Maxdate - Fatal编程技术网

Sql 每个项目的最长日期

Sql 每个项目的最长日期,sql,oracle,oracle11g,group-by,maxdate,Sql,Oracle,Oracle11g,Group By,Maxdate,我有一张简化的表格,如下所示: WITH TBL (ITEM, COST, DAY) AS ( SELECT 'A', 6, TO_DATE('2019-08-13', 'YYYY-MM-DD') FROM DUAL UNION ALL SELECT 'B', 4, TO_DATE('2019-08-21', 'YYYY-MM-DD') FROM DUAL UNION ALL SELECT 'B', 4, TO_DATE('2019-08-18', 'YYYY-MM-DD')

我有一张简化的表格,如下所示:

WITH TBL (ITEM, COST, DAY) AS (
  SELECT 'A', 6, TO_DATE('2019-08-13', 'YYYY-MM-DD') FROM DUAL
  UNION ALL
  SELECT 'B', 4, TO_DATE('2019-08-21', 'YYYY-MM-DD') FROM DUAL
  UNION ALL
  SELECT 'B', 4, TO_DATE('2019-08-18', 'YYYY-MM-DD') FROM DUAL
  UNION ALL
  SELECT 'A', 2, TO_DATE('2019-08-21', 'YYYY-MM-DD') FROM DUAL
  UNION ALL
  SELECT 'B', 5, TO_DATE('2019-08-16', 'YYYY-MM-DD') FROM DUAL
  UNION ALL
  SELECT 'C', 2, TO_DATE('2019-08-15', 'YYYY-MM-DD') FROM DUAL
) SELECT ITEM, COST, DAY FROM TBL;


ITEM | COST | DAY
-----+------+--------------------
A    | 6    | 2019-08-13 00:00:00
B    | 4    | 2019-08-21 00:00:00
B    | 4    | 2019-08-18 00:00:00
A    | 2    | 2019-08-21 00:00:00
B    | 5    | 2019-08-16 00:00:00
C    | 2    | 2019-08-15 00:00:00
我想查询每个项目的最新成本

ITEM | COST | DAY
-----+------+--------------------
B    | 4    | 2019-08-21 00:00:00
A    | 2    | 2019-08-21 00:00:00
C    | 2    | 2019-08-15 00:00:00
我这样做的方式是通过CTE获取每个项目的最新日期,然后 加入成本

WITH CTE (ITEM, DAY) AS (
  SELECT ITEM, MAX(DAY)
  FROM TBL
  GROUP BY ITEM
)
SELECT CTE.ITEM, TBL.COST, CTE.DAY
FROM CTE
JOIN TBL ON TBL.ITEM = CTE.ITEM AND TBL.DAY = CTE.DAY;
我的问题是,如果没有CTE,是否有一种更简单的方法可以在一个查询中完成这项工作

我试着将MAX与小组结合起来,但没有找到任何方法使它起作用

SELECT ITEM, COST, MAX(DAY)
FROM TBL
GROUP BY ITEM, COST;
它只对具有相同项目和成本的记录进行分组,而我实际需要的是将其与MAX day进行相应分组

ITEM | COST | DAY
-----+------+--------------------
A    | 6    | 2019-08-13 00:00:00
B    | 4    | 2019-08-21 00:00:00
A    | 2    | 2019-08-21 00:00:00
B    | 5    | 2019-08-16 00:00:00
C    | 2    | 2019-08-15 00:00:00
不存在以下情况:

SELECT t.ITEM, t.COST, t.DAY
FROM TBL t
WHERE NOT EXISTS (
  SELECT 1 FROM TBL
  WHERE ITEM = t.ITEM AND DAY > t.DAY
)
请参阅。
结果:


您可以使用
row\u number
分析函数,该函数将根据
partition by
order by
子句对每一行进行编号:

试试这个:

SELECT ITEM, COST, DAY FROM
(SELECT t.ITEM, t.COST, t.DAY,
ROW_NUMBER() over (partition by t.ITEM ORDER BY T.DAY DESC) AS RN
FROM TBL t)
WHERE RN = 1;


干杯

最简单的是带有第一个/最后一个选项的最小/最大值:

select item, max(day), max(cost) keep (dense_rank last order by day) from tbl group by item;


参考文档和示例。

虽然我很困惑,但这是可行的,因为我从未使用过它,但它并不存在。您能解释一下逻辑吗?它只返回日期较大的同一项目中不存在其他行的行。这意味着结果只包含每个项目的最新日期行。它有效。
max(cost)保持什么(按天排列最后一个订单)
确切地说是什么?它的工作原理与max类似,但标准不是
cost
,而是一天。所以它找到了最后一天的成本价值。如果有两个这样的值,则max()需要更大的值。如果你想降低成本,就用min()。哦,我明白了。我用一个在同一天有两种不同成本的项目进行了测试,可以看到最大/最小值选择一种成本,而同时选择两种成本。我不太确定哪一个答案会被接受,因为我不认为会发生这种情况,但如果是这样的话,我可能只希望返回一条记录……尽管在尝试查看另一个答案是否也可以返回一个成本后,我发现可以通过将max/min添加到成本中,并将group by添加到项目和日期中。所以这两个答案都是正确的,非常好,只能接受一个,不幸的是,两个答案都投了赞成票。尽管我无法让它发挥作用,但这似乎是正确的。是针对Oracle 11g的吗?在询问之前,我曾试着自己用过分区,但失败了,代码中的分区也输入错误。很抱歉输入错误。你确定它不起作用吗。请看Nevermind,它确实有效,只是在
行号之后缺少
()
。酷。碰巧,但很高兴知道它起了作用:)
select item, max(day), max(cost) keep (dense_rank last order by day) from tbl group by item;