当前位置: 首页 > 面试题库 >

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

姬俊远
2023-03-14
问题内容

从第n个组中选择单个记录/值的最简单方法是什么?该组由物料及其价格确定(价格可以更改)。我需要找到最后一个物料的最后一个日期和最后一个物料价格组的最后一个日期。所以我想知道什么时候确切的价格改变了。

我试过下面的查询以获取当前(最后)价格的第一个日期,如果以前使用过该价格,则该日期可能会返回错误的日期:

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

这也只会返回最后一个,我该如何获取以前的?那么,上一个/第一个使用前一个价格的日期是什么?

我简化了我的架构,并使用sample-data创建了 这个sql-
fiddle
。按时间顺序排列。因此,我需要ID =
7的行,因为它具有最新日期的倒数第二个价格。

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

甚至可以对这个值进行参数化设置,因此nthLatestPriceGroup如果我想知道最后一个价格日期的第三位?请注意,查询位于标量值函数中。

编辑 :非常感谢所有人。但不幸的ROW_NUMBER是,这里似乎没有一个简单的方法,因为我正尝试在给定材料 的当前价格之前 获得
最近价格 的行。因此,GROUP BY/PARTITION BY material,price包含价格相同但不属于最近的物料价格组的行。

考虑价格可以从

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

所以我想要最后20组的最新行的日期,最旧的20组是无关紧要的。因此,我必须以某种方式对 连续 价格进行分组,因为价格在更改后可以重复。

因此,实际上,我只需要上面列表Claim_Submitted_Date中以其开头的价格组中1 month ago ... previous price的最新价格,这是直到先前价格有效的日期。注释中列出的其他信息非常好(nthLatestPriceGroup子问题)。这是ID=7上面的示例数据中包含的行。顺便说一句,这个价格组中最老的行是ID=2(10月17日),而不是ID=6(6月23日),即使后者较旧。之后有一个不同的价格(10)。这就是为什么我不能使用简单的排名功能的原因。


问题答案:

您将需要在子查询中使用窗口函数ROWNUMBER,…

这样的事情将带您到那里:

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

如果idData是增量的(因此按时间顺序),则可以使用以下方法:

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

这是基于此的小提琴。



 类似资料:
  • 问题内容: 如何选择连续的第一个和最后一个? 问题答案: 您可以使用和伪选择器: 这应该在所有主流浏览器上都可以使用,但是当动态添加元素时IE7会出现一些问题(在IE6中将无法使用)。

  • 问题内容: 我正在尝试编写这样的日历功能 是整数(1、2、3 …),$ day是一天(Sun,Mon,…)或数字,以较容易的一个为准。方向有些混乱,因为它进行了不同的计算。 举个例子 它使用默认值,并获得5月的第一个星期日,即2009-05-03。如果我们打电话 ,它将返回5月的第二个最后一个星期日,即2009-05-24。 问题答案: 也许可以使其更快。。。 代码非常有趣。 请注意,前进1表示反

  • 问题内容: 我需要查询方面的帮助。 我有这个简单的表: 看起来像这样: 我想为给定的readVal获得最后的连续行: 在上面的示例中将是: id:3 for readVal = 2 id:8 for readVal = 3 我尝试了以下查询: 只要该系列中没有缺失的ID,它就可以工作。在上面的示例中,编号4缺失,查询将不会返回预期的结果。 谢谢! 问题答案: 返回: 对于还需要最后一行的情况: 返

  • 问题内容: 我发布此消息是因为该主题刚刚在另一个问题/答案中提出,并且该行为没有得到很好的记录。 考虑数据框 我想获取由column定义的每个组的第一行和最后一行。 我试过了 但是,这并没有给我我所期望的。 如何获得每个组中的实际第一个和最后一个值? 问题答案: 一种选择是使用该方法: 但是,我还没有找到一种将它们整齐地聚合的方法。当然,总是可以使用构造函数: 注意:我明确使用了该属性,否则您必须

  • 我能够得到最后一行的数据帧在熊猫用这行 如何获取此行中第一列的单元格?-我试过了 但它没有奏效

  • 例如,从下面的代码 这只是一个示例数据集,我有一个包含6000行的数据框,我想找到每列的第一个和最后一个值,其中我还有作为值。我也不知道我的第一个值或最后一个值的索引。 我试过了 很少有人来自Link1,Link2,但没有任何成功。我还想得到第一个元素,而不是最小值。