回答

收藏

获取第n连续组的第一行/最后一行

技术问答 技术问答 225 人阅读 | 0 人回复 | 2023-09-14

从第n选择单个记录/值的最简单方法是什么?该组由材料及其价格确定(价格可以更改)。我需要找到最后一种材料的最后一个日期和最后一种材料价格组的最后一个日期。所以我想知道确切的价格什么时候会改变。. e) A/ o+ l$ \) p: l- f
我试过以下查询以获得当前(最后)价格的第一个日期。如果我以前使用过这个价格,这个日期可能会回到错误的日期:
$ @' u* q& r! z5 z4 v( pDECLARE @material VARCHAR(20)SET @material = '1271-4303'SELECT TOP 1 Claim_Submitted_Date FROM   tabdataWHERE 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这只会回到最后一个。我该如何获得以前的?那么,使用前最后一个/第一个价格的日期是什么呢?' Y9 o( s% ^5 `3 {/ R5 J
我简化了我的架构,并使用了它sample-data创建了 这个sql-
% F# M# b6 H- M  ]  Jfiddle
    。按时间顺序排列。因此,我需要ID =6 v3 f  i/ ~! t, z! {0 Z) h+ O- s
7行,因为它有最新日期的倒数第二个价格。# `+ V* t7 m! ]$ N+ B3 U
ID   CLAIM_SUBMITTED_DATE                   MATERIAL    PRICE5   December,04 2013 12:33:0000000         12711-4303   204December,3003 2013 12:33:0000000         1271-4303   20   这个值甚至可以参数化设置,所以nthLatestPriceGroup如果我想知道最后一个价格日期的第三位?请注意,查询位于标量值函数中。
% c3 i- y- q4 w/ g* W( I4 i编辑    :非常感谢大家。但不幸的是,ROW_NUMBER是的,这里似乎没有一个简单的方法,因为我试图给出材料 在当前价格之前    获得
, j, X2 C1 {6 v0 T, t最近价格    行。GROUP BY/PARTITION BY material,price包括价格相同但不属于最近的材料价格组。$ `. M% s) M$ \* q3 D8 t% j
可以考虑价格
# M  D2 j# _# ~' u# |& @Date             Price     Comment5 months ago                                                                                                                                             original price,note that this is the same as the curent which causes my query to fail!3 months ago                                                                                                                                  price has changed,i might need the first and last date2 months ago                                                                                                                                             price has changed,i might need the first and last date1 month ago                                                                                                                                   previous price,i need the oldest and newest dates NOW                                                                                                                                                      current price,i need the first/oldest date from this group所以我想要最后20组的最新日期,最旧的20组并不重要。因此,我必须以某种方式对 连续    价格分组,因为价格可以在更改后重复。
/ T- c+ \+ }# a+ |" o1 K2 j2 J: M所以,其实我只需要上面的列表Claim_Submitted_Date1 开头的价格组1 month ago ... previousprice最新价格是直到之前价格有效的日期。注释中列出的其他信息非常好(nthLatestPriceGroup子问题)ID=7上述示例数据中包含的行。对了,这个价格组最老的行是ID=2(10月17日)ID=6(6月23日),即使后者是旧的。之后有不同的价格(10)。这就是为什么我不能使用简单的排名功能。( Y' z: q. H! ?; n
                                                               
" I- n6 o; q" B4 M9 G$ h2 G# {    解决方案:                                                                $ R3 w. w8 u% }  I! Y
                                                                您需要在子查询中使用窗口函数ROWNUMBER,…
' V. U( k$ Q1 Y, l0 y. A4 w9 _这样的事情会带你去那里:
* l# F8 [. B" E$ VROW_NUMBER() OVER(PARTITION BY Price ORDER BY Claim_Submitted_Date DESC) AS Row根据您的小提琴进行更新:8 C9 H/ F; E" w  U9 a
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) resWHERE rn=2如果idData以下方法可用于增量(因此按时间顺序):* B( b8 }) e& r: }3 n4 |8 P" H
SELECT * FROM(SELECT  *,       ROW_NUMBER() OVER(PARTITION BY Material ORDER BY idData DESC) AS rn  FROM tabdata t2 WHERE Material = @material) res在查看您的最新要求时,我们可能会三思而后行(如果我理解正确):
. [8 ]2 W! Y2 C5 r. G6 c' iDECLARE @MATERIAL AS VARCHAR(9)SET @MATERIAL = '1271-4303'SELECT  TOP 1 *FROM tabdata t2 WHERE Material = @materialAND PRICE  (  SELECT TOP 1 Price                FROM tabdata                 WHERE Material = @material                 ORDER BY CLAIM_SUBMITTED_DATE desc)ORDER BY CLAIM_SUBMITTED_DATE desc--resultsidData  Claim_Submitted_Date        Material    Price2013年7      -11-08 12:16:00.000     1271-4303   18这是基于小提琴。
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则