结合表给定日期标准

时间:2012-04-01 00:04:10

标签: sql tsql join

我正在尝试将两个表组合在一起,并且我想要一个最小的id,其中一个表的日期大于另一个表的日期。我认为这是一项简单的任务,但它给了我一个合适的选择。

这是我天真的尝试:

select table1.id, MIN(table2.id)

FROM table1
   INNER JOIN table2
     ON table2.id = table1.id

WHERE table1.date > table2.date

这不起作用,因为一旦table1中的日期大于table2,它就会加入所有id,而不仅仅是大于日期的id。这意味着无论如何都会返回最小的id。

由于

编辑清晰度:

产品

id | price_date
---------------
 1 | 2011-01-02

价格

id | fid | price_date
---------------
 1 |  1  | 2011-01-01
 2 |  1  | 2012-01-01

所以我想回归

product.id | price.id
---------------------
    1      |   1

3 个答案:

答案 0 :(得分:1)

这可能就是你要找的东西。

select table1.id, 
       table1.date, 
       MIN(table2.date) Table2MinDate, 
       MIN(table2.id) Table2SmallestID
FROM table1
   INNER JOIN table2
     ON table1.date < table2.date
group by table1.id, table1.date
order by 1, 2

我坚信table1和table2之间应该存在连接条件,但它不能是id,因为从table2请求最小id是没有意义的。它总是与table1中的id具有相同的值。

You might check Sql Fiddle

答案 1 :(得分:0)

我真的不喜欢这个,似乎有点蛮力。但那是你要找的那种结果吗?

编辑以匹配样本数据:

select id AS product_id
      ,(select min(id)
          from price
          where fid = p.id
            and price_date <= p.price_date
       ) AS price_id
  from product p

EDIT2:随着样本数据显示fk关系,Nikola的回应是更好的解决方案:

select p.id AS product_id
      ,MIN(x.id) AS price_id
  from product p
      ,price x
  where x.fid = p.id
    and x.price_date <= p.price_date
  group by p.id

答案 2 :(得分:0)

我不确定我完全理解你想要实现的目标 - 我假设你想为table1中的每一行返回table2的min(),其中table1.date&gt; table2.date。在这种情况下,您可以使用子选择:

SELECT table1.id, (SELECT min(id) FROM table2 WHERE table1.date > table2.date) 
FROM table1
   INNER JOIN table2
     ON table2.id = table1.id AND table1.date > table2.date