【问题标题】:Compare Previous column data with the next column data将上一列数据与下一列数据进行比较
【发布时间】:2019-04-06 16:29:31
【问题描述】:

我有一个包含以下列的销售表。我想选择销售价格上涨的行,并跳过上面行的销售价格上涨的那些下跌的销售价格。 例如在下表中,我希望除具有 saleid=4 的行之外的所有行

+--------+--------+-----------+
| SaleId | ItemId | SalePrice |
+--------+--------+-----------+
| 1      | 987    | 12        |
+--------+--------+-----------+
| 2      | 678    | 13        |
+--------+--------+-----------+
| 3      | 987    | 15        |
+--------+--------+-----------+
| 4      | 542    | 11        |
+--------+--------+-----------+
| 5      | 678    | 16        |
+--------+--------+-----------+

我尝试过使用内连接。但它什么也没显示。 这是我写的查询:

select s1.* from saletable s1
join saletable s2 on s1.saleid = s2.saleid
where s1.saleprice<s2.saleprice

【问题讨论】:

  • 好吧,其实是MS Sql server,不过我在找通用算法
  • 如果最后一行的 SalePrice = 14 怎么办?
  • 它应该跳过 as saleid: 5 has a price of 16
  • 不,我的意思是如果 SaleId 为 5 的行的 SalePrice 是 14 而不是 16,它应该在结果中吗?请注意,在这种情况下,它的价值高于前一个 ...
  • 不,不包括,因为最后一个最大值是15

标签: sql sql-server inner-join


【解决方案1】:

考虑以下使用运行最大值的解决方案

select t.*
from
(
    select *, max(SalePrice) over (order by SaleId) runningMaxSalePrice
    from testdata
) t
where t.SalePrice >= t.runningMaxSalePrice

此解决方案会随着 SalePrice 的降低跳过多个连续行。

DBFdiddle DEMO

【讨论】:

    【解决方案2】:

    使用lag():

    select st.*
    from (select st.*, lag(saleprice) over (order by saleid ) as prev_saleprice
          from saletable st
         ) st
    where prev_saleprice is null or saleprice > prev_saleprice 
    

    【讨论】:

    • 但它会跳过行,就像我在 saleid:6、7 和 8 处多次有 16 一样。它只显示 16 的一次出现,即 saleid:5
    • @MuhammadArslanJamshaid 。 . .您的问题指定“销售价格正在上涨”。如果您想要不减少,则只需将&gt; 替换为&gt;=
    • 对不起,增加或等于,我用过&gt;=它也包括11
    • 我认为当有多个连续行波纹管运行时,该解决方案是不正确的 max:dbfiddle.uk/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-13
    • 2018-03-14
    • 2017-10-02
    • 1970-01-01
    相关资源
    最近更新 更多