【问题标题】:Selecting Numbers from a Range of Years从年份范围中选择数字
【发布时间】:2013-02-17 22:20:16
【问题描述】:

我正在尝试执行如下表的 SQL 查询:

    id         in_year     out_year 
  -------    ----------  -------------
     1          2001        2002 
     2          2002        2002 
     3          2004        2007 

可以查询,以便我将该范围内的所有年份映射到 id。例如,我想得到:

    id         year 
 ---------   ---------
     1          2001
     1          2002
     2          2002
     3          2004
     3          2005
     3          2006 
     3          2007

具体来说,假设该表代表一家商店,其中包含元素及其到达商店和销售日期。该查询将返回映射到它们在商店中的年份的所有元素 ID。

【问题讨论】:

  • 没有一个优雅的解决方案(但您可以创建 SP 或临时表并加入多年) - 最好在您的应用程序中这样做
  • 我实际上是在尝试通过使用临时表来做到这一点。你是怎么加入的?
  • 创建一个编号为1..42的临时表,并用ON out_year <= in_year + tmp.n连接当前表,其中tmp是一个临时表,n是唯一的列名

标签: mysql sql database sqlite


【解决方案1】:

您可以使用数据范围内的年份构建一个临时表,即

CREATE TABLE tmp_years (
 yr YEAR NOT NULL,
 PRIMARY KEY (yr)
) ENGINE=INNODB;

INSERT INTO tmp_years (yr) VALUES (2000), (2001), (2002), (2003), (2004), (2005), (2006), (2007);

然后做一个 JOIN:

SELECT w.id, y.yr FROM wesams_table w 
INNER JOIN tmp_years y ON (y.yr >= w.in_year AND y.yr <= w.out_year);

【讨论】:

  • 不确定这是否可行。我无法对数据或范围做出假设,因为它会动态变化。例如,我想做的是找到 intime_years 的最小年份和 outtime_years 的最大值,从该 min-max 范围生成一个临时表,然后进行连接。你明白我在说什么吗?
【解决方案2】:

最简洁的解决方案是创建一个 UDF 来返回年份范围并使用 CROSS APPLY。

性能应该相当好,因为 UDF 将是确定性的

编辑:抱歉,我认为这不适用于 MySQL。

【讨论】:

    猜你喜欢
    • 2020-08-07
    • 1970-01-01
    • 2015-10-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-19
    相关资源
    最近更新 更多