在特定日期之后获得每件产品的第一行

时间:2016-06-01 18:02:42

标签: sql firebird greatest-n-per-group

我有一些表想要获取某些数据信息:

Product_code,qty,stock_before,stock_after,date

--------------------------------------------------------------
|product_code | qty | stock_before | stock_after |   date     |
-------------------------------------------------------------- 
| xpto1       |  0  |            1 |           1 | 2015-01-01 |
| xpto1       |  1  |            1 |           2 | 2015-02-01 |
| xpto1       |  2  |           -1 |           1 | 2015-03-01 |
| xpto2       |  0  |            1 |           1 | 2015-01-01 |
| xpto2       |  1  |            1 |           2 | 2015-02-01 |
| xpto2       |  2  |           -1 |           1 | 2015-03-01 |

我想知道stock_before,2015-01-01之后的每个产品

所以我想要的结果是

| xpto1 | 1 | 1 | 2 | 2015-02-01 |
| xpto2 | 1 | 1 | 2 | 2015-02-01 |

我得到了这个:

| xpto1 | 1 |  1 | 2 | 2015-02-01 |
| xpto1 | 2 | -1 | 1 | 2015-03-01 |
| xpto2 | 1 |  1 | 2 | 2015-02-01 |
| xpto2 | 2 | -1 | 1 | 2015-03-01 |

让我们说我只想要为每种产品找到第一条记录。

2 个答案:

答案 0 :(得分:0)

Select Product_code, qty, stock_before, stock_after, date
From table a
Where a.date > '01.01.2015' and 
a.date = (Select min(b.date) from
 table b where b.product_code = 
a.product_code and b.date = a.date)

如果product_code,date是唯一组合,这将起作用因为subselect必须只返回一条记录。

答案 1 :(得分:0)

您的表格结构效率低下,应重新设计。

通常库存余额存储在两个表格中,如ballance(id,date)和ballance_product(id,ballance_id,product_id,quantity)。

首先从ballance时间轴中检索某个日期的ID,然后从ballance_product中检索某些ballance_id中的所有可用产品和数量。

ballance / ballance_product是在最后一个平衡*值和期间创建的文件的结束时间计算的。

将在某个日期返回产品库存的查询将是:

with
  last_move as
  (
    select m.product_code, max(m.adate) as adate
    from product_stock m
    where m.adate <= :to_date
    group by 1
  )
select s.id, s.product_code, s.qty, s.stock_before, s.stock_after, s.adate
from last_move m
join product_stock s on (s.product_code = m.product_code and s.adate = m.adate)

您的假设&#34;在某个日期之后&#34;不符合逻辑。在某个日期之后是一个无限期的长期。在某个日期检索股票。