【问题标题】:Percentage increase in price based on latest transaction date and previous transaction date基于最近交易日期和上一个交易日期的价格上涨百分比
【发布时间】:2018-03-23 04:43:33
【问题描述】:

,

我想根据最近的交易日期和上一次交易的日期获得国家和城市的价格上涨百分比。

我如何查询这个?我不明白。这是我尝试过的:

SELECT Country,City, Price
From tbl
Group by Country,City 

涨幅百分比 = [( 最新价格 - 之前价格 ) / 之前价格] * 100

预期输出: 独特的国家和城市名称 + 价格上涨百分比。
国家 |城市 |百分比

【问题讨论】:

  • 添加一些示例数据,这将有助于了解您想要什么
  • 我已经添加了示例数据。请点击超链接。
  • “价格百分比”是什么意思?平均价格?如果是 avg(price) 而不是 price.
  • 我的意思是价格上涨的百分比
  • 涨幅百分比 = [( 最新价格 - 之前价格 ) / 之前价格] * 100

标签: sql sql-server database


【解决方案1】:

这可能过于复杂。

设置一些随机数据:

IF OBJECT_ID('tempdb..#Cities') IS NOT NULL
BEGIN
    DROP TABLE #Cities;
END;

CREATE TABLE #Cities
(
    Country VARCHAR(20)
   , City    VARCHAR(20)
);

IF OBJECT_ID('tempdb..#Data') IS NOT NULL
BEGIN
    DROP TABLE #Data;
END;

CREATE TABLE #Data
(
    Country VARCHAR(20)
   , City    VARCHAR(20)
   , Price   DECIMAL(13, 4)
   , Date    DATETIME
);

INSERT INTO #Cities
VALUES      ('Country 1', 'City 1'), ('Country 1', 'City 2'), ('Country 1', 'City 3'), ('Country 2', 'City 4'), ('Country 2', 'City 5');


INSERT INTO #Data
SELECT Country
    , City
    , ROUND(RAND(CHECKSUM(NEWID())) * 100, 4) AS Price
    , DATEADD(DAY, ROUND(RAND(CHECKSUM(NEWID())) * 10, 0), GETDATE()) AS Date
FROM     #Cities
UNION
SELECT Country
    , City
    , ROUND(RAND(CHECKSUM(NEWID())) * 100, 4)
    , DATEADD(DAY, ROUND(RAND(CHECKSUM(NEWID())) * 10, 0), GETDATE())
FROM     #Cities;

--Delete duplicate dates

WITH data3 AS
(
SELECT *,ROW_NUMBER() OVER (PARTITION BY Country,City,Date ORDER BY Country,City,Date) AS RN
FROM #Data
)
DELETE FROM data3 WHERE RN<>1

查询数据以获取最近的价格、日期和百分比上涨:

SELECT        Dates.*
          , Latest.Price AS Latestprice
          , Previous.Price AS Previousprice
          , ((Latest.Price - Previous.Price) / Previous.Price) * 100 AS Percentageincrease
FROM
(
    SELECT    C.*
          , Latestdate.Latestdate
          , Previousdate.Previousdate
    FROM      #Cities AS C
            LEFT JOIN
    (
       --Latest Date for each county, city
       SELECT Country
           , City
           , MAX(Date) AS Latestdate
       FROM   #Data
       GROUP BY Country
            , City
    ) AS Latestdate ON Latestdate.Country = C.Country
                   AND Latestdate.City = C.City
            LEFT JOIN
    (
       --Previous Date for each county, city
       SELECT Country
           , City
           , Date AS Previousdate
       FROM
       (
          SELECT Country
              , City
              , Date
              , RANK() OVER(PARTITION BY Country
                                  , City ORDER BY Date DESC) AS Rank
          FROM   #Data
       ) AS A
       WHERE  Rank = 2
    ) AS Previousdate ON Previousdate.Country = C.Country
                    AND Previousdate.City = C.City
) AS Dates
JOIN #Data AS Latest ON Latest.Country = Dates.Country
                    AND Latest.City = Dates.City
                    AND Latest.Date = Dates.Latestdate
JOIN #Data AS Previous ON Previous.Country = Dates.Country
                     AND Previous.City = Dates.City
                     AND Previous.Date = Dates.Previousdate

为了比较,使用 lag() 获取每个日期的百分比增加。类似于戈登的回答:

SELECT D.Country
    , D.City
    , D.Date
    , Lag(Date) OVER(PARTITION BY Country
                           , City ORDER BY Date) AS Previousdate
    , D.Price
    , Lag(Price) OVER(PARTITION BY Country
                            , City ORDER BY Date) AS Previousprice
    , 100 * (Price / Lag(Price) OVER(PARTITION BY Country
                                        , City ORDER BY Date) - 1) AS PercentageIncrease
FROM   #Data AS D;

使用延迟获得与我的第一个查询相同的结果(每个城市的最新信息):

SELECT *
FROM
(
    SELECT D.Country
        , D.City
        , D.Date
        , Lag(Date) OVER(PARTITION BY Country
                              , City ORDER BY Date) AS Previousdate
        , D.Price
        , Lag(Price) OVER(PARTITION BY Country
                               , City ORDER BY Date) AS Previousprice
        , 100 * (Price / Lag(Price) OVER(PARTITION BY Country
                                           , City ORDER BY Date) - 1) AS Percentageincrease
        , ROW_NUMBER() OVER(PARTITION BY Country
                                , City ORDER BY Date DESC) AS Rn
    FROM   #Data AS D
) AS A
WHERE  Rn = 1
ORDER BY Country
      , City;

【讨论】:

    【解决方案2】:

    使用lag():

    select t.*,
           100 * ((price / lag(price) over (partition by country, city order by t_date) - 1) as increase
    from t;
    

    【讨论】:

      猜你喜欢
      • 2021-11-26
      • 2017-04-24
      • 2014-10-11
      • 2022-01-03
      • 1970-01-01
      • 1970-01-01
      • 2020-11-17
      • 2017-11-22
      • 2021-03-04
      相关资源
      最近更新 更多