ポスグレで指定した中で最大のレコードを1件取得する方法

このQ&Aのポイント
  • ポスグレで指定したテーブルの中から最大のレコードを1件取得する方法について教えてください。
  • テーブル内の指定した条件に一致するレコードの中で最大のレコードを1件取得する方法をポスグレで実現したいです。
  • ポスグレを使用して、特定の条件に合致するレコードの中で最も大きな値を持つレコードを1件だけ取得する方法を教えてください。
回答を見る
  • ベストアンサー

ポスグレで指定した中で最大のレコードを1件取得する

ポスグレで指定した中で最大のレコードを1件取得する方法を教えてください。 下記の項目を持つテーブルがあるとします。 ・部署 ・氏名 ・日付 ・連番 ・内容 KEY(部署,氏名,日付,連番) 部署と氏名を指定した中で直近のレコードを1件だけ取得したいです。 例えば select * from テーブル where 部署 = 値 and 氏名 = 値 order by 日付 desc ,連番 desc で頭の1件を抜ければよいのですが、 limit 1を指定しても、どうやらorder byより先にlimitがかかっているようで、並び替えた後の最初の1件をとれません。 また、 ソート項目が1つだけなら select * from テーブル where 部署 = 値 and 氏名 = 値 and 日付 = (select max(日付) from テーブル t1 where t1.部署 = 値 and t1.氏名 = 値) という事もできますが、 日付が最大の中での連番が最大というのはさらに一手間必要です。 何か良い方法はありませんか? 全件持ってきた後にアプリ側で最初の1件だけ使うのではなく、postgres内で1件にしてアプリ側に渡したいです。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

order by の前にlimit 1の処理が走ることはナイのでは? order by の条件を複数にしたときの desc やら ask やら 日付 ・連番どっちを先に書くかがまちがってるだけのような? まずlimit 1無しでsql実行して希望の並び順になっているかを確認してみては?

questorfe
質問者

お礼

有難うございます。 limit が先に効く事はないのですね。 試してみます。

その他の回答 (1)

  • t_ohta
  • ベストアンサー率38% (5061/13226)
回答No.2

limit は order by が行われた後に実行されるので、並べ替えに問題があるのでしょう。 limit を付けずにSQLを実行してみて思い通りに並び替えられているか確認しましょう。

questorfe
質問者

お礼

有難うございます。 limit が先に効く事はないのですね。 試してみます。

関連するQ&A

  • sqlのwhereで指定した条件の前後を取得したい

    テーブル=T) KEY DATA 001 あ 002 い 003 う 004 え 005 お SQL) SELECT DATA FROM T WHERE KEY = 003 ; 上記のSQLでは、「う」のデータしか取得できませんが、 「003」の前後1件、合計3件の「い」「う」「え」を取得する方法を教えて下さい。 ちなみに、 SELECT DATA FROM T WHERE KEY >= 003 AND ROWNUM <= 2 と SELECT * FROM ( SELECT DATA FROM T WHERE KEY < 003 ORDER BY KEY DESC ) WHERE ROWNUM < 1 のUNIONでは上手く行きませんでした。 よろしくお願いします。

  • 日付の最大値レコードを取得する方法について

    お世話になります。 SQLで日付の最大値を取得する方法です。 テーブルのデータ内容は以下のようになっています。 | 社員番号 | 社員名 | 日付 | 順序 | +---------+-------+-----------+-----+ | 100 | AAA | 2011/05/01 | 2 |   ← このレコードを取得したい +---------+-------+-----------+-----+ | 100 | AAA | 2011/05/01 | 1 | +---------+-------+-----------+-----+ | 100 | AAA | 2011/04/01 | 1 | +---------+-------+-----------+-----+ | 200 | BBB | 2011/04/01 | 2 |   ← このレコードを取得したい +---------+-------+-----------+-----+ | 200 | BBB | 2011/04/01 | 1 | +---------+-------+-----------+-----+ 取得したいレコードは、 社員ごとの最大日付の最大順序をもつレコードです。 (上記の1行目と4行目のレコードを取得したい) この場合、 下記のようなSQLを考えます。 --------------------------------- SELECT 社員番号, 社員名, 日付 FROM テーブル名 WHERE 社員番号 = 'xxx' AND 日付 = (SELECT MAX(日付) FROM テーブル名 ) AND 順序 = (SELECT MAX(順序) FROM テーブル名 ) ---------------------------------- 但し、上記の場合、 社員ごとに最大値レコードが取得できません。 どなたかレコード取得方法について 教えていただけないでしょうか? よろしくお願いいたします。

  • 複数の条件に該当する結果を、それぞれ2件ずつ取得したい

    こんにちは。 PostgreSQL 7でシステムを開発中ですが、同一テーブルから「列~の値が■のものを2件、列~の値が▲のものを2件、列~の値が●のものを2件、それ以外のものからランダムに2件を取得」したいのですが、実現できなくて困っています。 select * from table where culumn = 'data1' limit 2 union select * from table where culumn = 'data2' limit 2 というようなことなのですが、これでは「limit 2」でparse errorとなってしまいます。 できれば上記のSQL定義でビューを作りたいところなのですが、いい方法はないでしょうか? よろしくお願いします。

  • oracle sqlで先頭の1件を取得

    こんにちはみなさん。 現在、Oracle10gR2を使用しています。 そこで、以下のようなテーブルが存在します。 table_A(明細テーブル) denday | cd | suu | kingaku 2011/03/05 | 1| 1| 1000 2011/03/10 | 1| 2| 2000 table_B(マスタ) cd| henkoday | nm 1 | 2011/03/01| testA 1 | 2011/03/02| testB 1 | 2011/03/06| testC 上記マスタはcd、henkodayで管理しています。 上記table_Aとtable_Bを結合したいと思います。 そこで select t1.* ,t2.* from (select * from table_A order by denday) t1, (select * from table_B order by cd,henkoday desc) t2 where t1.cd=t2.cd and t1.denday>=t2.henkoday とした場合、マスタの3件分、明細データの重複ができてしまいます。 それを、直近の該当マスタのみ参照したいのですが、 以下のようなデータ抽出 table_A(明細テーブル)     table_B(マスタ) denday | cd | suu | kingaku | cd | henkoday | nm 2011/03/05 | 1 | 1 | 1000 | 1 | 2011/03/02 | testB 2011/03/10 | 1 | 2 | 2000 | 1 | 2011/03/03 | testC そのSQLがわかりません。 どうかよろしくお願いします。

  • 特定の範囲のデータを削除するには

    現在MySQLについて色々試行錯誤して勉強しています。 タイトルに関して、例えばSELECT構文ならば SELECT * FROM `mytable` WHERE `hoge` = 1 ORDER BY `foo` DESC LIMIT 10 , 20 で、該当の10件目~30件目(20件分)の範囲を取得できますが、 DELETE構文だと、LIMIT に offset (LIMIT 10←これ , 20)の指定が出来ないようで、 自分で考えた方法だと、範囲の決め手となる最小値・最大値を出してから、 WHERE節でその範囲に当てはまるものを消す、 といった形で、MySQLに3回アクセスすることになってしまいます。 またこの方法だと、最小値又は最大値と同じ値があると、 それを消すことができません。 (きっちりやるには他のユニークキーを用意して使用するなど手間がかかりそうです) 例のSELECT構文のように簡略化できないでしょうか。 どうかよろしくお願いします。 ----------------- 環境  PHP 5.2.5  MySQL 5.1.22

    • ベストアンサー
    • MySQL
  • レコードを1件のみ取得した後、検索をやめる方法はあるのでしょうか?

    PostgreSQLのデータベースでテーブルから、 "1件のレコードが見つかった時点で、他のレコードを検索するのをやめる" という事はSQLでできるのでしょうか? 【テーブル名 Fruit 】 | id | option | name |  1    2     りんご  2    1     みかん  3    1     メロン  4    1     バナナ  5    4     いちご 上記のようなテーブルから、optionが1のレコードを検索する時、 どのレコードでもいいので、1件見つけた時点で他にも該当のレコードがあるかという検索の処理をしない。 という事はできるのでしょうか? 出来るのであれば、膨大な数のレコードがある場合、検索の時間が減るのでは無いかと思ったのですが・・・ 現在は下記のSQLのように、OFFSETとLIMITを使用して1件のレコードを取得しています。 SELECT      * FROM      Fruit WHERE      option=1 OFFSET 0 LIMIT 1 このやり方であっているのでしょうか? または他の仕方があるのでしょうか? 教えていただきたいです。 宜しくお願いします。

  • サブクエリ

    サブクエリで、t2テーブルに列が無いか、t2テーブルの中でuflgの値が1である列がヒットする場合に真を返すなら、 where ... and 0=(select count(*) from t2) or 0<(select count(*) from t2 where uflg=1) のようにサブクエリに2つのselectを書かないと無理ですか?

  • 最近の20件を取得するSQL

     現在PostgreSQL上にあるDBをOracleに移行しようとしていますが、Oracleに詳しくないためご教示いただきたく存じます。  2000万行ほどの売り上げテーブルがあります。  そこである商品やジャンルで絞り込みをおこない(または全く絞り込みをせず)最近20件を検索したいと思っています。(正確に言うと、次ページ、前ページなどでその前後を取得する機能も必要です。)  で、この最近の20件、というところで躓いています。  いろいろと検索してみると select * from ( select 検索項目... from sold where 絞り込み条件 order by sold_date desc ) where rownum<20; なんていう例が載っていたりするのですが、これだと絞り込みがない場合に内側のselect文で2000万件なめてしまうので論外です。(試しにやってみたら30秒くらいかかりました)  別段レアなケースでもなく、こういう要件はとても一般的だと思うのですが、Oracleではどのように実装するのが一般的なのでしょうか。  よろしくお願いいたします。

  • SQLの外部結合について教えて下さい

    いつもお世話になっています。 SQL構文の外部結合が分らなくて困っています。 どうか教えて下さい。 JSPからString Nam = (request.getParameter("param"));で値を受け取ってその値でT_Tableと一致するデータのSQLを実行します。 SELECT * FROM T_Table where ID='"+ Nam +"' order by 日付 desc この結果とT_TableAの「番号」というフィールドと一致する問い合わせのSQLが分りません。自分なりに考えて作りましたがHTMLの部分の表示だけでレコードが表示されないので間違っているのだと思います。 色々調べてみましたが該当のサンプルがなかったので困っています。 教えて下さい!宜しくお願い致します。 【自分で作成してみたSQLです】 テーブルはSQL Serverです。 "SELECT * FROM T_Table where ID='"+ Nam +"' INNER JOIN where ID='"+ Nam +"' ON [T_Table].[番号] = [T_TableA].[番号] order by 日付 desc"

    • ベストアンサー
    • Java
  • Accessで最新レコード20件を表示させるには

    Access2000のクエリで、最新のレコード20件を表示させたい場合どのようにしたら良いでしょうか? レコード番号があり、最新番号が100の場合、80~100を表示させたいのですが。 SQLベースだと SELECT no_c FROM table ORDER no_c DESC limit 20 など、limitが使えますが、Accessでこれに該当するものはありますか?