Sql nk I误译了“下一个最后一个的最后一个日期”)。我会再看一眼的。这看起来很有效,谢谢。如果我真的需要找到其他价格组,也许我会使用这种方法。当我回到办公室时,我必须用真实的数据来测试它。简单的最后一种方法已经达到了我真正需要的程度。不过,如果它真的有效,我

Sql nk I误译了“下一个最后一个的最后一个日期”)。我会再看一眼的。这看起来很有效,谢谢。如果我真的需要找到其他价格组,也许我会使用这种方法。当我回到办公室时,我必须用真实的数据来测试它。简单的最后一种方法已经达到了我真正需要的程度。不过,如果它真的有效,我,sql,sql-server,tsql,sql-server-2005,Sql,Sql Server,Tsql,Sql Server 2005,nk I误译了“下一个最后一个的最后一个日期”)。我会再看一眼的。这看起来很有效,谢谢。如果我真的需要找到其他价格组,也许我会使用这种方法。当我回到办公室时,我必须用真实的数据来测试它。简单的最后一种方法已经达到了我真正需要的程度。不过,如果它真的有效,我会接受的,因为它是豪华版。@TimSchmelter thx,但在第二(第三?)个想法中,我担心它远不是豪华版,在两个交替价格的简单序列中会惨败。。。一个比最初看起来要复杂得多的问题;-)。。。在第四个想法中,它只需要删除一个有缺陷的“独特的”


nk I误译了“下一个最后一个的最后一个日期”)。我会再看一眼的。这看起来很有效,谢谢。如果我真的需要找到其他价格组,也许我会使用这种方法。当我回到办公室时,我必须用真实的数据来测试它。简单的最后一种方法已经达到了我真正需要的程度。不过,如果它真的有效,我会接受的,因为它是豪华版。@TimSchmelter thx,但在第二(第三?)个想法中,我担心它远不是豪华版,在两个交替价格的简单序列中会惨败。。。一个比最初看起来要复杂得多的问题;-)。。。在第四个想法中,它只需要删除一个有缺陷的“独特的”来让它工作。。。doneA simple
行号似乎在这里没有帮助,因为我试图获取给定材料当前价格之前的最新价格行。因此,
按物料分组
/
按物料划分,价格
包括不属于上一次物料价格组的价格相同的行。考虑到价格可以从20(最旧)变为18,回到20,然后回到18(最新的)。我想要最后20组最近一行的日期,最老的20组是不相关的。所以我必须以连续的价格进行分组。
DECLARE @material VARCHAR(20)
SET @material = '1271-4303'

SELECT TOP 1 Claim_Submitted_Date 
FROM   tabdata
WHERE Material = @material 
AND Price = (SELECT TOP 1 Price FROM tabdata t2 
             WHERE Material = @material
             ORDER BY Claim_Submitted_Date DESC)
ORDER BY Claim_Submitted_Date ASC
ID   CLAIM_SUBMITTED_DATE                   MATERIAL    PRICE
5   December, 04 2013 12:33:00+0000         1271-4303   20
4   December, 03 2013 12:33:00+0000         1271-4303   20   <-- current
3   November, 17 2013 10:13:00+0000         1271-4846   40
7   November, 08 2013 12:16:00+0000         1271-4303   18   <-- last(desired)
2   October, 17 2013 09:13:00+0000          1271-4303   18
1   September, 17 2013 08:13:00+0000        1271-4303   10
8   September, 16 2013 12:15:00+0000        1271-4303   17
6   June, 23 2013 14:22:00+0000             1271-4303   18
9   January, 11 2013 12:22:10+0000          1271-4303   20   <-- a problem since this is older than the desired but will be returned by my simply sub-query approach above
Date             Price     Comment
5 months ago     20        original price, note that this is the same as the curent which causes my query to fail!
3 months ago     18        price has changed, i might need the first and last date
2 months ago     20        price has changed, i might need the first and last date
1 month ago      18        previous price, i need the oldest and newest dates 
NOW              20        current price, i need the first/oldest date from this group
ROW_NUMBER() OVER(PARTITION BY Price ORDER BY Claim_Submitted_Date DESC) AS Row 
DECLARE @material VARCHAR(20)
SET @material = '1271-4303'


SELECT * FROM
(
SELECT  *,
        ROW_NUMBER() OVER(PARTITION BY Material ORDER BY Claim_Submitted_Date ASC) AS rn  
FROM tabdata t2 
WHERE Material = @material
) res
WHERE rn=2
SELECT * FROM
(
SELECT  *,
        ROW_NUMBER() OVER(PARTITION BY Material ORDER BY idData DESC) AS rn  
FROM tabdata t2 
WHERE Material = @material
) res
DECLARE @MATERIAL AS VARCHAR(9)
SET @MATERIAL = '1271-4303'

SELECT  TOP 1 *
FROM tabdata t2 
WHERE Material = @material
AND PRICE <> (  SELECT TOP 1 Price
                FROM tabdata 
                WHERE Material = @material 
                ORDER BY CLAIM_SUBMITTED_DATE desc)
ORDER BY CLAIM_SUBMITTED_DATE desc

--results
idData  Claim_Submitted_Date        Material    Price
7       2013-11-08 12:16:00.000     1271-4303   18
 select a.[IDDATA]
, a.[CLAIM_SUBMITTED_DATE]
, a.[MATERIAL]
 , a.[PRICE]
 ,row_number() over (PARTITION by material,price order by claim_submitted_date) as seq
 from tabdata a
 where a.material= '1271-4303'
declare @materialId nvarchar(max), @targetrank int
set @materialId = '1271-4303'
set @targetrank =2


;with grouped as (
    select *, 
              (select count( t.price)  -- don't put a DISTINCT here. (I know, I did)
               from tabdata as t 
               where t.Price <> tj.Price 
                 and t.Claim_Submitted_Date> tj.Claim_Submitted_Date 
                  and t.Material= @materialId
              )as group_indicator 
      from tabdata tj 
      where Material= @materialId
), 
rankedClaims as
(
    select grouped.*, row_number() over (PARTITION BY material,price,group_indicator  ORDER BY claim_submitted_date desc) as rank
    from grouped
),
numbered as
(
   select *, ROW_NUMBER() OVER (order by Claim_Submitted_Date desc) as RowNumber from
   rankedClaims 
   where rank =1
)
select Id, Claim_Submitted_Date, Material, Price from numbered
    where RowNumber=@targetrank
SELECT ranked.[CLAIM_SUBMITTED_DATE]
FROM
(
  SELECT trimmed.*, ROW_NUMBER() OVER (ORDER BY claim_submitted_date) AS rank FROM
  (
    SELECT a.*
      ,row_number() over (PARTITION BY material,price ORDER BY claim_submitted_date) AS daterank
    FROM tabdata a
    WHERE a.material= '1271-4303'
  )
  AS trimmed
  WHERE daterank=1
) AS ranked
WHERE rank=2
DECLARE @material VARCHAR(20), @Nth INT
SET @material = '1271-4303'
SET @Nth = 2

;with CTE1 ([idData],[Claim_Submitted_Date], [Material], [Price], Rn)
as
(
SELECT  *,
        DENSE_RANK() OVER(ORDER BY PRICE DESC) AS rn  
FROM tabdata  
WHERE Material = @material
)
,
CTE2 ([idData],  [Material], [Price], LastDate)
AS(
SELECT [idData],  [Material], [Price], MAX([Claim_Submitted_Date])
FROM CTE1
WHERE rn = @Nth
GROUP BY [idData],  [Material], [Price]
)
SELECT Top 1 [idData],  [Material], [Price], LastDate
FROM CTE2 
ORDER BY LastDate DESC
idData  Material    Price   LastDate
  7     1271-4303   18      2013-11-08 12:16:00.000