SQL和嵌套查询的使用

时间:2015-08-20 06:37:02

标签: sql sql-server tsql

我很难为这个问题形成正确的查询。虽然它可能不是很难。我得到了一个提示并告诉他使用嵌套查询重做它,但需要一些帮助。

基本上我需要这样做:

  1. 检索所有称为ChargeId的文本列表。
  2. 每个都有很多,所以每个都应该有最新的日期。
  3. 如果ChargeId与最新日期不止一次,则会对其进行版本控制。因此,在这种情况下,请使用最新版本。
  4. 基本上这些是电价,它们在Windows窗体中被更改。日期是它们有效的时间。如果用户在不更改日期的情况下更改其中一些,那么它只会获得更新的版本。版本3成为版本4.这是我的尝试,显然返回太多,因为每个ChargeId出现不止一次。

    enter image description here

    请注意,所有相关价格均为版本4.它们不必具有相同的版本或相同的日期。它只是简单地检索所有价格,每个价格的最新日期。如果有多个ChargeId行,那么请选择版本最高的那个。"

    编辑:我认为这样可行,但并非所有ChargeId都在那里。

    enter image description here

3 个答案:

答案 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