【问题标题】:Select records between values of two columns在两列的值之间选择记录
【发布时间】:2012-08-23 19:35:38
【问题描述】:

我有下表,它保存了一年中特定星期的销售数据。

销售

week | year | value
50   | 2011 | 150
51   | 2011 | 151
52   | 2011 | 152
1    | 2012 | 170
2    | 2012 | 190
3    | 2012 | 180
4    | 2012 | 160
5    | 2012 | 170
6    | 2012 | 290

我想查找位于 year1 的第 1 周和第 2 年的第 2 周之间的记录。

例如

  1. 2011 年第 50 周到 2012 年第 5 周之间
  2. 2012 年第 1 周到 2012 年第 6 周之间

在 SQL 方面几乎没有经验,我尝试了以下查询,该查询适用于案例 2,但不适用于案例 1。

SELECT * from sales WHERE (week >= 1 AND year >= 2012) AND (week <= 6 AND year <= 2012 ) 

据我所知,条件分组似乎不起作用。好像没有条件分组一样。

【问题讨论】:

    标签: sql ruby-on-rails postgresql


    【解决方案1】:
    select *
    from
    (
       Select *, year*100 + week as yearweek
       from table
    ) v
    where yearweek between 201150 and 201205
    

    【讨论】:

    • +1 我有相同的解决方案。好处是该语句适用于这两种情况,而不必诉诸容易出错的or 子句。不利的一面是该语句不可分割。
    • 这与 SQL 完美配合。挑战在于如何将此查询映射到 Rails ActiveRecord 查询机制。
    • @AmitPatel find_by_sql,也许?
    • @AmitPatel - 我没有,但社区有 。平心而论,podiluska 是第一个回答的。
    • @Lieven 没有考虑品味 :)
    【解决方案2】:

    比较即席记录更简单、更快、更优雅:

    SELECT *
    FROM   tbl
    WHERE (year, week) BETWEEN (2011, 50) AND (2012, 5);
    

    closely related answer 上的更多详细信息,包括基准测试和一些更多可能的解决方案。

    【讨论】:

      【解决方案3】:

      此查询适用于案例 1:

      SELECT * from sales WHERE (week >= 50 AND year = 2011) OR (week <= 5 AND year = 2012 )
      

      而这应该适用于大多数相邻年份的情况(例如 2011 年和 2012 年或其他年份,但不是 2001 年到 2010 年)。这种情况有点复杂,但仍然相当简单。

      DECLARE @week1 INT
      DECLARE @week2 INT
      DECLARE @year1 INT
      DECLARE @year2 INT
      
      SELECT * from sales WHERE (week >= @week1 AND year = @year1) OR (week <= @week2 AND year = @year2 )
      

      好的,这是更大范围的示例。

      DECLARE @week1 INT
      DECLARE @week2 INT
      DECLARE @year1 INT
      DECLARE @year2 INT
      
      SELECT * from sales WHERE (week >= @week1 AND year = @year1) OR (week <= @week2 AND year = @year2 ) OR (year > @year1 AND year < @year2)
      -- This last one gives ALL weeks for the full years between year1 and year2 (e.g. all weeks for 2002-2009 if we choose dates between 2001 and 2010)
      

      【讨论】:

      • 只是为了解释一下,我这样做是为了利用可能存在的任何索引。
      【解决方案4】:

      第一个例子试试这个

          SELECT * 
          FROM sales 
          WHERE (year = 2011 AND week > 50) 
             OR (year = 2012 AND week < 5)
      

      一般

          SELECT * 
          FROM sales 
          WHERE (year = 'year1' AND week > 'week1') 
             OR  (year > 'year1' AND year < 'year2' ) 
             OR (year = 'year2' AND week < 'week2' )
      

      【讨论】:

      • 这个(year &gt; 2011 AND year &lt; 2012) 永远不会是真的
      • 检查一般查询。这只是第一种情况的一个例子。当然,如果有一年的差异是没有意义的
      猜你喜欢
      • 1970-01-01
      • 2012-02-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-14
      相关资源
      最近更新 更多