4

最新の変更時刻を持つすべてのレコードを取得したいと思います。たとえば、次の表を使用します。

|page_url|last_modified|
---------
|abc.com |2010-10-01 10:00:00|
|xyz.com |2010-10-04 12:10:00|
|xyz.com |2010-10-04 12:00:00|
|xyz.com |2010-10-04 10:00:00|
|abc.com |2010-10-01 08:00:00|

出力には次のデータが含まれている必要があります。

|page_url|last_modified|
---------
|abc.com |2010-10-01 10:00:00|
|xyz.com |2010-10-04 12:10:00|

以下のようなhaving句を使用してみましたが、うまくいきません:(

SELECT page_url, last_modified 
FROM
my_table
HAVING MAX(last_modified);

編集 1: テーブルに 25 個のフィールドを使用しています。しかし、私は group by をすべて適用することはできないと思います。今何をする?

4

5 に答える 5

4

HAVINGこのGROUP BY句だけで使用する必要はありません。

SELECT page_url, MAX(last_modified) 
FROM my_table
GROUP BY page_url

更新 1

SELECT  a.*
FROM    my_table a
        INNER JOIN
        (
            SELECT page_url, MAX(last_modified) recentDate
            FROM my_table
            GROUP BY page_url
        ) b ON a.page_url = b.page_url AND
                a.last_modified = b.recentDate
于 2012-10-11T08:33:27.160 に答える
2

INPostgresql、MySql、Oracle などのタプル対応の RDBMS を使用している場合。次のアプローチを使用できます。

したがって、次のような既存のビューが既にあるとしましょう。

create view page_latest as

SELECT page_url, MAX(last_modified) recentDate
FROM tbl
GROUP BY page_url;


select * from page_latest;

出力...

| PAGE_URL |                     RECENTDATE |
---------------------------------------------
|  abc.com | October, 01 2010 10:00:00+0000 |
|  xyz.com | October, 04 2010 12:10:00+0000 |

...このデータに基づく:

| PAGE_URL |                  LAST_MODIFIED |            MESSAGE |
------------------------------------------------------------------
|  abc.com | October, 01 2010 10:00:00+0000 |           no alarm |
|  xyz.com | October, 04 2010 12:10:00+0000 |       no surprises |
|  xyz.com | October, 04 2010 12:00:00+0000 | fake plastic trees |
|  xyz.com | October, 04 2010 10:00:00+0000 |              creep |
|  abc.com | October, 01 2010 08:00:00+0000 |         thom yorke |

前述の RDBMS のタプル対応 IN で上記のビューを再利用することにより、最新のメッセージをすべて見つけることができます: http://www.sqlfiddle.com/#!2/b8193/2

select * 
from tbl
where (page_url,last_modified) in (select page_url, recentDate from page_latest);

出力:

| PAGE_URL |                  LAST_MODIFIED |      MESSAGE |
------------------------------------------------------------
|  abc.com | October, 01 2010 10:00:00+0000 |     no alarm |
|  xyz.com | October, 04 2010 12:10:00+0000 | no surprises |

クエリが短くなるだけでなく、読みやすくなります。ただし、ビューが横たわっていない場合は、クエリで「ビュー」をインライン化できます: http://www.sqlfiddle.com/#!2/b8193/5

select * 
from tbl
where (page_url,last_modified) in

  (SELECT page_url, MAX(last_modified) recentDate
   FROM tbl
   GROUP BY page_url);

この回答は、Sql Server では機能しません。Tuple-capable をサポートしていないデータベースはごくわずかですがIN、残念ながら Sql Server はその 1 つです。

于 2012-10-11T13:43:13.747 に答える
2

group byandmax()selectステートメントで使用してみてください

SELECT page_url, max(last_modified) 
FROM  my_table
group by page_url

詳しくは:

于 2012-10-11T08:34:06.987 に答える
0
SELECT z.page_url,z.last_modified 
FROM (SELECT page_url, MAX(last_modified) 
      FROM my_table 
      GROUP BY page_url) as z 
ORDER BY z.page_url
于 2012-10-11T08:37:23.587 に答える
0

これらはどうですか-

    SELECT   page_url,last_modified,other field
    FROM my_table
    ORDER BY page_url,last_modified

また

   SELECT  distinct page_url,last_modified,other field
   FROM my_table
   ORDER BY page_url,last_modified
于 2012-10-11T10:12:32.923 に答える