【发布时间】:2013-12-04 16:11:03
【问题描述】:
从第 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
这也只返回最后一个,我如何获得上一个?那么上一个价格最后/第一个使用的日期是什么时候?
我已经简化了我的架构并使用示例数据创建了this 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 组无关紧要。所以我必须以某种方式按连续价格分组,因为价格在已经改变后可能会重复。
所以实际上我只需要上面列表中以1 month ago ... previous price 开头的价格组中的最新Claim_Submitted_Date,这是上一个价格有效之前的日期。 cmets 中列出的其他信息非常好(nthLatestPriceGroup 子问题)。这就是上面示例数据中带有ID=7 的行。顺便说一句,这个价格组中最旧的行将是 ID=2(17 月 17 日)而不是 ID=6(6 月 23 日),即使后者更旧。之后有不同的价格(10)。这就是我不能使用简单排名函数的原因。
【问题讨论】:
-
只是为了澄清!您在 sql-fiddle 中提供的示例数据中您期望的结果是什么?
-
@huMptyduMpty:很抱歉造成混乱,我现在希望用正确的所需行编辑我的答案。
-
SQLFiddle 能解决您的问题吗?据我了解,您正在根据组内的
max ID寻找price -
@Kiril:谢谢。但不幸的是,它没有返回我需要的东西。我在我的问题的第一个版本中错误地请求了错误的行。根据我的要求,正确的行是带有
ID=7和date=November, 08的行(在我上面的示例数据中对此进行了评论)。这是正确的行,因为它是最后一个材料价格组的第一行(日期描述)。当前价格是 20,最后是 18,在 18 组中最新的是 ID=7。您的查询仅返回给定材料的(第二)最旧的。主要问题是我的团队依赖于连续价格。 -
我是否正确地说您正在寻找给定 MATERIAL 的倒数第三个值??
标签: sql sql-server tsql sql-server-2005