我很难为这个问题形成正确的查询。虽然它可能不是很难。我得到了一个提示并告诉他使用嵌套查询重做它,但需要一些帮助。
基本上我需要这样做:
基本上这些是电价,它们在Windows窗体中被更改。日期是它们有效的时间。如果用户在不更改日期的情况下更改其中一些,那么它只会获得更新的版本。版本3成为版本4.这是我的尝试,显然返回太多,因为每个ChargeId出现不止一次。
请注意,所有相关价格均为版本4.它们不必具有相同的版本或相同的日期。它只是简单地检索所有价格,每个价格的最新日期。如果有多个ChargeId行,那么请选择版本最高的那个。"
编辑:我认为这样可行,但并非所有ChargeId都在那里。
答案 0 :(得分:1)
我相信您可以使用ROW_NUMBER
执行此操作:
返回结果分区中行的序号 设置,从1开始,每个分区的第一行。
SELECT ChargeId, Version, StartDate
FROM (
SELECT *,
RN = ROW_NUMBER() OVER(PARTITION BY ChargeId ORDER BY StartDate DESC, Version DESC)
FROM SWMarket.Price
WHERE CompanyId = 1
)AS p
WHERE RN = 1
使用ORDER BY StartDate DESC
获取最新日期。如果最新StartDate
有多行,那么我们会使用Version
获取最新的ORDER BY Version DESC
。
答案 1 :(得分:0)
您似乎从未使用SQL Server
中的RANKING
函数。这是适合您的查询:
SELECT *
FROM (
SELECT P.ChargeID
, P.[Version]
, P.StartDate
, ROW_NUMBER() OVER (PARTITION BY P.ChargeId ORDER BY P.[Version] DESC) AS RN
FROM SWMarket.Price AS P
WHERE P.CompanyID = 1
) AS T
WHERE T.RN = 1;
查询按ChargeID对表结果进行分区,并根据每个ChargeID的版本(按降序排列)为每个ChargeID分配唯一的ROW_NUMBER()。因此,最高版本将为RN = 1
,第二高版本将为RN = 2
,依此类推。所以在这一点上,使用RN = 1
选择所有记录非常简单,他们将为ChargeID提供最新版本。
答案 2 :(得分:0)
您可能需要找到最高版本。所以代码应该是
select chargeid,max(versioned) as versioned, date from
(
your above code
) as t
group by chargeid, date