【问题标题】:Return calculated column values for SELECT DISTINCT query返回 SELECT DISTINCT 查询的计算列值
【发布时间】:2018-07-01 06:56:54
【问题描述】:

我在 SQlite 中有下表:

_id|token|状态|时间戳|心情|eta|名称|calc_eta __________________________________________________________________________ 168|iqmC.3aHMBGbl|ok|1516625084498|50|-4154|样品名称|1516625533082 169|iqmC.3aHMBGbl|ok|1516625084498|50|-4214|样品名称|1516625533108 170|iqmC.3aHMBGbl|ok|1516625084498|50|-4274|样品名称|1516625533414 171|iqmC.3aHMBGbl|ok|1516625084498|50|-4334|样品名称|1516625533160 172|iqmC.3aHMBGbl|ok|1516625084498|50|-4394|样品名称|1516625533680 173|iqmC.3aHMBGbl|ok|1516625084498|50|-4420|样品名称|1516625533068 174|iqmC.3aHMBGbl|ok|1516625084498|50|-4428|样品名称|1516625533482 175|iqmC.3aHMBGbl|ok|1516625084498|50|-4483|样品名称|1516625533155 176|iqmC.3aHMBGbl|ok|1516625084498|50|-4543|样品名称|1516625533148 177|TFbintkHMBw4H|ok|1516630122485|50|2526|样品名称|1516632672019 178|TFbintkHMBw4H|ok|1516630122485|50|2520|样品名称|1516632671903 179|TFbintkHMBw4H|ok|1516630122485|50|2460|样品名称|1516632672321 180|TFbintkHMBw4H|ok|1516630122485|50|2344|样品名称|1516632672859 181|TFbintkHMBw4H|ok|1516630122485|50|2336|样品名称|1516632671939 182|TFbintkHMBw4H|ok|1516630122485|50|2281|样品名称|1516632672802 183|TFbintkHMBw4H|ok|1516630122485|50|2220|样品名称|1516632671828 184|TFbintkHMBw4H|ok|1516630122485|50|2161|样品名称|1516632672625

我正在尝试对它提出一个查询,它会给我两个最新的(基于自动增量 _id)、calc_eta 值之间的差异对于每个不同的 token 值。

所以在这种情况下,结果应该是:

iqmC.3aHMBGbl|-7

TFbintkHMBw4H|797

我在 SQL 方面已经做到了这一点,但它目前没有为每个不同的令牌提供计算值,我不知道如何更进一步。

SELECT DISTINCT token,

  (SELECT calc_eta
   FROM DATA s
   WHERE
       (SELECT count(*)
        FROM DATA f
        WHERE f.token = s.token
          AND f._id >= s._id) <= 1) -
  (SELECT calc_eta
   FROM
     (SELECT calc_eta,
             MIN(_id)
      FROM DATA s
      WHERE
          (SELECT count(*)
           FROM DATA f
           WHERE f.token = s.token
             AND f._id >= s._id) <= 2)) AS delay
FROM DATA;

【问题讨论】:

  • 用您正在使用的数据库标记您的问题。

标签: sql sqlite select distinct calculated-columns


【解决方案1】:

在大多数 SQL 方言中,您会使用诸如 lag() 之类的窗口函数:

select d.*,
       (calc_eta - prev_calc_eta) as diff
from (select d.*,
             lag(calc_eta) over (partition by token order by _id) as prev_calc_eta,
             row_number() over (partition by token order by _id desc) as seqnum
      from data d
     ) d
where seqnum = 1;

【讨论】:

  • HI Gordon,谢谢你,不幸的是它是针对 SQLite3 的,据我所知,窗口函数没有实现。不使用这些可以实现吗?
猜你喜欢
  • 2013-06-03
  • 1970-01-01
  • 2015-08-24
  • 1970-01-01
  • 2012-10-07
  • 1970-01-01
  • 1970-01-01
  • 2015-12-28
  • 1970-01-01
相关资源
最近更新 更多