2

我非常感谢为此编写选择查询的所有帮助。

我的表

 sw_id | url_id |  open_date   | valid
----------------------------------------
  101  |  com   |  2013-01-01  |  1
  202  |  net   |  2013-01-02  |  1
  202  |  net   |  2013-02-02  |  1 
  303  |  com   |  2013-01-03  |  1 
  303  |  com   |  2013-02-03  |  1 
  303  |  com   |  2013-03-03  |  1 
  404  |  org   |  2013-01-04  |  1 
  404  |  org   |  2013-02-04  |  1 
  404  |  gov   |  2013-02-04  |  1
  404  |  gov   |  2013-04-04  |  1 
  ...

我们需要找到相同 sw_id、url_id 的 open_date 较少的有效 (valid=1) 行。

选择查询应该从上面输出行,如下所示:

查询输出

 sw_id | url_id |  open_date   | valid  |  min_open_d 
-----------------------------------------------------
  202  |  net   |  2013-02-02  |  1     |  2013-01-02
  303  |  com   |  2013-02-03  |  1     |  2013-01-03
  303  |  com   |  2013-03-03  |  1     |  2013-01-03
  404  |  org   |  2013-02-04  |  1     |  2013-01-04
  404  |  gov   |  2013-04-04  |  1     |  2013-02-04

如您所见,我们仅选择 open_date 高于最低值 min(open_date) 的行。

我希望你能从上面的描述中理解问题。

4

3 回答 3

1

如果您也在这里展示自己的努力会很好,但基本上子查询是(新手最容易理解的)方法之一。

SELECT
    sw_id,
    url_id,
    open_date,
    valid,
    (
        SELECT MIN(open_date)
        FROM MyTable t2
        WHERE t2.sw_id = t1.sw_id GROUP BY t2.sw_id
    ) AS min_open_d
FROM
    MyTable t1
WHERE
    valid = 1
ORDER BY
    open_date DESC
于 2013-01-28T21:15:13.197 回答
1

您的示例和解释对解释有点开放,但这样的事情应该很接近。

SELECT  sw_id ,
        url_id ,
        open_date ,
        valid ,
        ( SELECT    MIN(open_date)
          FROM      mytable mt2
          WHERE     mt2.sw_id = mt1.sw_id
                    AND mt1.url_id = mt2.url_id
          GROUP BY mt2.sw_id, mt2.url_id
        ) AS min_open_d
FROM    mytable mt1
WHERE   valid = 1 AND mt1.open_date >          
        ( SELECT    MIN(open_date)
          FROM      mytable mt3
          WHERE     mt3.sw_id = mt1.sw_id
                    AND mt1.url_id = mt3.url_id
          GROUP BY mt3.sw_id, mt3.url_id
        )
于 2013-01-28T21:15:52.733 回答
0

使用 OLAP 函数可以更优雅地解决这个问题:

select * from (
    select sw_id, 
           url_id, 
           open_date, 
           valid, 
           min(open_date) over (partition by sw_id,url_id) as min_open_d
       from MyTable
       where valid = 1
    )
    where open_date <> min_open_d;

这也应该比子查询更有效。

于 2013-01-29T14:23:12.300 回答