【问题标题】:Return rows if the column value is different than the previous days record如果列值与前几天的记录不同,则返回行
【发布时间】:2018-07-18 18:43:23
【问题描述】:

我想要一个选择查询,它返回我当天的所有行,前提是“金额”与前几天不同。

sales
-id
-user_id
-amount
-datetime

sales 表每天为每个 user_id 获取一条新记录。

一个示例场景如下:

5   123    700  2017/01/05
4   123    500  2017/01/04
3   123   1500  2017/01/03
2   123   1500  2017/01/02
1   123    500  2017/01/01

因此,如果您搜索 1 月 5 日的记录,您将得到 1 行,因为它与前几天不同(700 对 500)。

结果:

5   123    700  2017/01/05

但是如果您在 3 日运行查询,由于 1500 美元的金额与 2 日相同,您将得到 0 个结果。

我有这个基本连接,但我需要以某种方式比较 s1 中的当前日期行并将其与前几天的金额值进行比较。

select s1.*
from sales as s1
    inner join sales s2 on s1.user_id = s2.user_id and s1.datetime = s2.datetime

【问题讨论】:

  • 这与您昨天发布的问题完全相同。 stackoverflow.com/questions/51385491/…我们看不到你的屏幕或读懂你的想法。 “不起作用”是什么意思?你有错误吗?结果不正确?
  • @SeanLange 结果不正确,它只是加入同一天的结果。
  • 尝试在JOIN 语句上使用:s1.DateTime = DateAdd(Day,-1,s2.DateTime) AND s1.Amount <> s2.Amount。不过我会使用LEFT JOIN。如果这是该用户 ID 的第一个条目怎​​么办?

标签: sql sql-server


【解决方案1】:

你基本上有查询。你只需要日期算术:

select s.*
from sales s left join
     sales sprev
     on sprev.user_id = s.user_id and sprev.datetime = dateadd(day, -1, s.datetime)
where s.datetime = '2018-01-05' and
      (s.amount <> sprev.amount or sprev.amount is null);

【讨论】:

  • 你不是说s.amount &lt;&gt; sprev.amount 中的Where 吗?
  • @WEI_DBA 。 . .这就是OP所要求的。谢谢。
猜你喜欢
  • 2018-12-25
  • 2015-04-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-27
  • 1970-01-01
  • 1970-01-01
  • 2022-01-11
相关资源
最近更新 更多