代码之家  ›  专栏  ›  技术社区  ›  nz_21

Sql查询视图与联接?

sql
  •  1
  • nz_21  · 技术社区  · 2 年前

    我有一个noob-sql问题。所以我有了这张表,并附上了一个查询 https://www.mycompiler.io/view/BhSdU94MdsD

    -- INIT database
    CREATE TABLE Product (
      ProductID INTEGER PRIMARY KEY AUTOINCREMENT,
      Name TEXT,
      TimeScale INTEGER,
      CreatedTime Integer
    );
    
    INSERT INTO Product(Name, Timescale, CreatedTime) VALUES ("foo", 1, 101);
    INSERT INTO Product(Name, Timescale, CreatedTime) VALUES ("bar", 2, 1500);
    

    基本上,每个产品都有一个名称、时间刻度和创建时间。每个产品都会有一个“滞后”。这被计算为创建的时间和与时间尺度相关联的阈值之间的差。

    时间刻度1的阈值为100,因此时间刻度=1的产品将具有滞后:CreatedTime-100。

    类似地,2的时间尺度具有1000的阈值,因此 产品将有一个滞后:CreatedTime-1000。

    我想做的是编写一个查询,根据相关的滞后时间对所有产品进行排序。有人能给我指正确的方向吗?我觉得我需要创建一个视图 计算“滞后”列,但不确定这是否是最好的前进方式

    2 回复  |  直到 2 年前
        1
  •  2
  •   Schwern    2 年前

    使用 case 语句,根据时间刻度计算滞后。

    select
      *,
      case Timescale
        when 1 then CreatedTime - 100
        when 2 then CreatedTime - 1000
        else null
      end as "lag"
    from Product
    

    如果你经常使用这个,你可以 create a view 为了方便。

    create view product_lag as
    select
      *,
      case Timescale
        when 1 then CreatedTime - 100
        when 2 then CreatedTime - 1000
        else null
      end as "lag"
    from Product;
    
    select * from product_lag;
    

    或者您可以添加 virtual or generated column 其中声明一列,该列是从其他列自动生成的。

    alter table product add column "lag" integer generated always as (
      case timescale
        when 1 then CreatedTime - 100
        when 2 then CreatedTime - 1000
        else null
      end
    );
    

    Demonstration 感谢您提供工作空间。

        2
  •  0
  •   Alfin E. R.    2 年前

    看起来这种情况需要进一步的参考来将时间尺度映射到其各自的滞后(即100、1000)。

    如果只有一个或两个时间尺度,那么一个简单的 case when 应该足以获得滞后。

    如果还有更多,那么另一个表作为映射引用可能会很有用。然而,如果要避免创建表,那么另一种选择是在CTE或子查询中引入逻辑,以增强更多数据,从而获得滞后及其时间尺度。

    全部和全部,在通过联接到表/cte/subquery成功地将时间尺度映射到其各自的滞后之后(或者如果 案例当 待实现),然后 timediff (或类似的)函数将能够根据滞后来计算时间。

    如果该查询不时有用,则可以具体化为视图。