質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.45%

  • Ruby on Rails

    9113questions

    Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

  • Ruby on Rails 4

    2552questions

    Ruby on Rails4はRubyによって書かれたオープンソースのウェブフレームワークです。 Ruby on Railsは「設定より規約」の原則に従っており、効率的に作業を行うために再開発を行う必要をなくしてくれます。

  • Active Record

    313questions

    Active Recordは、一つのオブジェクトに対しドメインのロジックとストレージの抽象性を結合するデザインパターンです。

activerecordの最大(最小)値が格納された行の取得方法

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 5,910

TakakiSato

score 62

Rails4でActiveRecordを利用して以下のようにデータ取得をしています。

result=TestTable.select("date,dataA,dataB").order("date desc").offset(1).limit(20)

この取得結果の内dataAが最大もしくは最小の値が格納されている行(date,dataA,dataBのすべて)を取得したいです。
(offset,limitを利用して直近20行分のレコードの内の最大値,最小値を検索したいです。)

maximumなどが使えるかと思ったのですが、それですとdataAの最大値のみが取得されるだけなので要件を満たせません。

何か良い方法ないでしょうか?

よろしくお願いします。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

+3

良い方法か分かりませんが、分けて考えて発行してはどうでしょうか。

時間でソートした20件目を取得する。

dateK=TestTable.select("date").order("date desc").offset(1).limit(20).last.date

20件目以降でdateAでソートして最大と最小を取る。ような感じ例。

#最大
max=TestTable.select("*").where(["date > ?",dateK]).order("dataA desc").first
#最小
min=TestTable.select("*").where(["date > ?",dateK]).order("dataA desc").last

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/02/06 13:02

    いつもありがとうございます!!頂いた回答参考にうまく動かくことができました.

    キャンセル

+1

最大値をえたら、その値で where すればよいのでは?

$ rails c
[1] pry(main)> Client.maximum(:orders_count)
   (0.2ms)  SELECT MAX("clients"."orders_count") FROM "clients"
=> 3
[2] pry(main)> Client.where(orders_count: Client.maximum(:orders_count))
   (0.3ms)  SELECT MAX("clients"."orders_count") FROM "clients"
  Client Load (0.3ms)  SELECT "clients".* FROM "clients" WHERE "clients"."orders_count" = ?  [["orders_count", 3]]
+----+------------+-----------+--------+--------------+--------------------+--------------------+
| id | first_name | last_name | locked | orders_count | created_at         | updated_at         |
+----+------------+-----------+--------+--------------+--------------------+--------------------+
| 1  | Ryan       | Rachid    | false  | 3            | 2015-12-27 02:2... | 2015-12-27 02:2... |
| 2  | Lifo       | Rachid    | true   | 3            | 2015-12-27 02:2... | 2015-12-27 02:2... |
| 7  | 安倍       | 次郎      | true   | 3            | 2015-12-27 02:2... | 2015-12-27 02:2... |
+----+------------+-----------+--------+--------------+--------------------+--------------------+
3 rows in set
[3] pry(main)> Client.all
  Client Load (0.3ms)  SELECT "clients".* FROM "clients"
+----+------------+-----------+--------+--------------+--------------------+--------------------+
| id | first_name | last_name | locked | orders_count | created_at         | updated_at         |
+----+------------+-----------+--------+--------------+--------------------+--------------------+
| 1  | Ryan       | Rachid    | false  | 3            | 2015-12-27 02:2... | 2015-12-27 02:2... |
| 2  | Lifo       | Rachid    | true   | 3            | 2015-12-27 02:2... | 2015-12-27 02:2... |
| 3  | Sara       | Rachid    | false  | 2            | 2015-12-27 02:2... | 2015-12-27 02:2... |
| 4  | Fifo       | Smith     | false  |              | 2015-12-27 02:2... | 2015-12-27 02:2... |
| 5  | Filo       | Smith     | true   | 2            | 2015-12-27 02:2... | 2015-12-27 02:2... |
| 6  | 安倍       | 太郎      | true   | 1            | 2015-12-27 02:2... | 2015-12-27 02:2... |
| 7  | 安倍       | 次郎      | true   | 3            | 2015-12-27 02:2... | 2015-12-27 02:2... |
| 8  | ussel      | Smith     | false  |              | 2015-12-27 02:2... | 2015-12-27 02:2... |
| 9  | Andy       | Smith     | false  |              | 2015-12-27 02:2... | 2015-12-27 02:2... |
| 10 | AndyX      |           | true   |              | 2015-12-27 02:2... | 2015-12-27 02:2... |
| 11 | AndyY      |           | true   |              | 2015-12-27 02:2... | 2015-12-27 02:2... |
| 12 | Nick       |           | false  |              | 2015-12-27 02:2... | 2015-12-27 02:2... |
+----+------------+-----------+--------+--------------+--------------------+--------------------+
12 rows in set
[4] pry(main)>

参考情報:

...
20.4 最大値
テーブルに含まれるフィールドの最大値を得るには、そのテーブルを持つクラスに対してmaximumメソッドを呼び出します。このメソッド呼び出しは以下のようなものになります。
  Client.maximum("age")
...

追記: 2016-02-04
created_at で desc でsort して、limit をとったら、ruby 側で目的とする項目でソートするのは如何でしょう。

Frame number: 0/20
[1] pry(main)> xx = Client.order("created_at desc").limit(6)
  Client Load (130.5ms)  SELECT  "clients".* FROM "clients"  ORDER BY created_at desc LIMIT 6
+----+------------+-----------+--------+--------------+-----------------+-----------------+
| id | first_name | last_name | locked | orders_count | created_at      | updated_at      |
+----+------------+-----------+--------+--------------+-----------------+-----------------+
| 12 | Nick       |           | false  |              | 2015-12-27 0... | 2015-12-27 0... |
| 11 | AndyY      |           | true   |              | 2015-12-27 0... | 2015-12-27 0... |
| 10 | AndyX      |           | true   |              | 2015-12-27 0... | 2015-12-27 0... |
| 9  | Andy       | Smith     | false  |              | 2015-12-27 0... | 2015-12-27 0... |
| 8  | ussel      | Smith     | false  |              | 2015-12-27 0... | 2015-12-27 0... |
| 7  | 安倍       | 次郎      | true   | 3            | 2015-12-27 0... | 2015-12-27 0... |
+----+------------+-----------+--------+--------------+-----------------+-----------------+
6 rows in set
[2] pry(main)> xx.to_a.sort{|a,b| a.orders_count.to_i <=> b.orders_count.to_i}.reverse[0]
+----+------------+-----------+--------+--------------+-----------------+-----------------+
| id | first_name | last_name | locked | orders_count | created_at      | updated_at      |
+----+------------+-----------+--------+--------------+-----------------+-----------------+
| 7  | 安倍       | 次郎      | true   | 3            | 2015-12-27 0... | 2015-12-27 0... |
+----+------------+-----------+--------+--------------+-----------------+-----------------+
1 row in set
[3] pry(main)>

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/02/03 08:09

    回答ありがとうございます。
    わかりづらく恐縮なのですが、
    今回の要件としてdateでソートした直近20行分のレコードの内の最大値,最小値を検索したいです。
    maximumを使用すると、テーブル全体の最大値を取得してからテーブル全体の最大値に合致するレコードを取得してしまう理解です。
    dateでソートした直近20行分のレコードの内の最大値,最小値をもつレコードを取得する方法で良い方法はないでしょうか?

    よろしくお願いします!!

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.45%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る

  • Ruby on Rails

    9113questions

    Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

  • Ruby on Rails 4

    2552questions

    Ruby on Rails4はRubyによって書かれたオープンソースのウェブフレームワークです。 Ruby on Railsは「設定より規約」の原則に従っており、効率的に作業を行うために再開発を行う必要をなくしてくれます。

  • Active Record

    313questions

    Active Recordは、一つのオブジェクトに対しドメインのロジックとストレージの抽象性を結合するデザインパターンです。