Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.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_Sql Server_Sql Server 2008_Tsql_Sql Server 2012 - Fatal编程技术网

按表中最后一条记录筛选SQL中重复项号的特定日期

按表中最后一条记录筛选SQL中重复项号的特定日期,sql,sql-server,sql-server-2008,tsql,sql-server-2012,Sql,Sql Server,Sql Server 2008,Tsql,Sql Server 2012,我想知道如何在SQL中实现以下逻辑,我有一个包含以下格式数据的表: Date ItemNo Price -------------------------- 20160101 101 150 20160101 101 155 20160101 101 140 20160101 102 144 20160101 103 147 20160102 101 150 201601

我想知道如何在SQL中实现以下逻辑,我有一个包含以下格式数据的表:

Date      ItemNo     Price
--------------------------
20160101   101        150
20160101   101        155
20160101   101        140
20160101   102        144
20160101   103        147
20160102   101        150
20160102   101        155
20160102   101        140
20160102   102        144
20160102   103        147
因此,从上面,我想选择所有ItemNo,但仅从ItemNo 101中选择最后一个条目作为示例,它可以是任何ItemNo,它具有相同日期的多个数据,因此这意味着我的输出表将具有以下输出:

Date      ItemNo     Price
--------------------------
20160101   101        140
20160101   102        144
20160101   103        147
20160102   101        140
20160102   102        144
20160102   103        147

有没有办法做到这一点

除非您有一列指定了排序,否则没有最后一项no。如果您没有唯一的id,我建议如下:

select Date, ItemNo, Price
from t
where itemno <> 101
union all
select Date, ItemNo, Price
from (select t.*, 
             row_number() over (partition by date, itemno order by itemno) as seqnum
      from t
      where itemno = 101
     ) t
where seqnum = 1;
select date, itemno, max(price) as price
from t
group by date,
         (case when itemno <> 101 then id end);
;with cte as (
    select
        Date, ItemNo, Price,
        row_number() over(partition by Date, ItemNo order by Time desc) as rn
    from <table>
)
select
    Date, ItemNo, Price
from cte
where
    rn = 1
如果您确实有唯一的id,则可以执行以下操作:

select Date, ItemNo, Price
from t
where itemno <> 101
union all
select Date, ItemNo, Price
from (select t.*, 
             row_number() over (partition by date, itemno order by itemno) as seqnum
      from t
      where itemno = 101
     ) t
where seqnum = 1;
select date, itemno, max(price) as price
from t
group by date,
         (case when itemno <> 101 then id end);
;with cte as (
    select
        Date, ItemNo, Price,
        row_number() over(partition by Date, ItemNo order by Time desc) as rn
    from <table>
)
select
    Date, ItemNo, Price
from cte
where
    rn = 1

诚然,这总是会返回itemno的最高价格,但这确实符合任何定义。

我不知道如何定义“最后一项”-根据您的数据,不清楚为什么价格160是itemno 101和日期20160101的最后一项。但是如果您有一些带有“Time”或“Id”的列,您可以这样做:

select Date, ItemNo, Price
from t
where itemno <> 101
union all
select Date, ItemNo, Price
from (select t.*, 
             row_number() over (partition by date, itemno order by itemno) as seqnum
      from t
      where itemno = 101
     ) t
where seqnum = 1;
select date, itemno, max(price) as price
from t
group by date,
         (case when itemno <> 101 then id end);
;with cte as (
    select
        Date, ItemNo, Price,
        row_number() over(partition by Date, ItemNo order by Time desc) as rn
    from <table>
)
select
    Date, ItemNo, Price
from cte
where
    rn = 1
可以使用最后一个值

SELECT DISTINCT
  date,
  itemno,
  LAST_VALUE(price) OVER (PARTITION BY date, itemno ORDER BY itemno)
FROM #test

我的表格中的数据总是按顺序排列的,我只是想找到一种方法,如何获取具有多个值的项目的最后一个条目…请记住,项目价格可以在这两个值之间变化,而不一定是最高值:例如:第一个条目是100$,第二个条目是200$,第三个条目是150$@3MRAN。SQL表表示无序集。没有排序,除非列明确定义它。感谢您更正我的信息,所以关于上面的代码。。。它只适用于ITEMNO 101,在我的表中,有一个不同的ITEMNO在同一日期可以有多个条目的机会,上面会考虑这个动态。只能回答被问到的问题,而这个问题是关于第101项的。如果你有不同的问题,那么再问另一个问题。如果您修改此选项,您将使任何试图提供帮助的人的答案无效,并且无效的答案将吸引选票。感谢您在此处提供的帮助。。。但是我已经清楚地提到了,它可以是任何ItemNo,它在同一日期有多个数据,我的表中的数据总是有序的,我只是想找到一种方法,如何获取一个具有多个值的项目的最后一个条目……请记住,项目价格可以在这两个值之间变化,而不一定是最高值:例如:第一个条目是100美元,第二个是200美元,第三个是150美元。sql表中没有保证顺序这样的东西。基本上,如果您将订单一个接一个地放入表中,您不能指望在选择时会以相同的顺序收到订单。这就是为什么你需要“订单依据”条款。这有一些陷阱,但一般来说-没有订单谢谢你更正我的信息,所以关于上面的代码。。。它只适用于ITEMNO 101,在我的表中,有一个不同的ItEMNO在同一日期可以有多个条目的机会,上面会考虑这个动态。@ 3MRAN对于每个项目号都有多个条目,有一个主键或一个DATE时间字段,有时间来理解添加了哪些记录的顺序?因为你可以按照一些人的建议使用行号,但是索引和查询优化会改变你的顺序,它可能不一定代表记录输入的顺序。也就是说,是2008年还是2012年?如果两人都把2008放在这里,那么你就不会得到具体的2012方法,比如Kannan显示的nice easy LAST_值+1,除非我注意到这是一个2012+答案,这里的顺序应该在主键或时间字段上,或者一些指示输入记录顺序的东西上。不必担心,仅仅更改查询中涉及的列就可以对结果进行重新排序,否则它将始终完全像MINprice按日期分区一样。