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) 行を見つける必要があります。

selectクエリは、次のように上から行を出力する必要があります。

クエリ出力

 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

ここでも自分の努力を示してくれると良いのですが、基本的にサブクエリは(初心者にとって最も理解しやすい)方法の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 に答える