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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Ruby on Rails 5

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

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Q&A

3回答

1225閲覧

日付が今日以降のものとそうでないものでソートしたい

keng

総合スコア32

Ruby on Rails 5

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

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

0グッド

0クリップ

投稿2018/03/14 01:41

とあるイベントを管理するものだとします(日付:open_at)

↓まだ未開催のイベント(日付が今日以降のもの)
直近

さらに後
↓すでに開催済みのイベント(日付が今日以前のもの)
最近終わったもの

昔に終わったもの

の順番でソートしたいのですがどうしたら良いのでしょうか?
できればrails5での解決方法で教えていただきたいですが、どのようなSQLで解決すべきなのかも教えていただけると幸いです。
よろしくお願いします。

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

mysqlでやるとこんな感じになります
postgreと若干書式は違うとおもうので順次よみかえてください

SQL

1create table tbl(id int unique,d date); 2insert into tbl values 3(1,'2018-03-12'), 4(2,'2018-03-13'), 5(3,'2018-03-14'), 6(4,'2018-03-15'), 7(5,'2018-03-16');
  • 抽出

SQL

1select * from tbl 2order by case when d>='2018-03-14' then 0 else 1 end asc 3,abs(datediff(d,'2018-03-14')) asc
  • 対象日を含む未来日を優先し
  • 対象日との差の絶対値=なんにち離れているかでソート

投稿2018/03/15 01:26

yambejp

総合スコア114843

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

どのくらいの件数でしょうか。
今日以降分と昨日以前分にソートキーをつけて
unionすればいけると思います。

SQL

1select * from ( 2 select *, 0 as sortkey1, open_at - now() as sortkey2 from table where open_at => now() -- 今日以降 3 union all 4 select *, 1 as sortkey1, now() - open_at as sortkey2 from table where open_at < now() -- 昨日以前 5) order by sortkey1, sortkey2

今日を含む未来日と過去日を判定するためにsortkey1を
日付の順序性をsortky2としています。
now()は時間まで入ってしまうので、丸めが必要かもしれません。

投稿2018/03/14 05:16

szk.

総合スコア1400

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

postgresはよく知りませんが[open_at]列を降順で並べればいいだけでは?

sql

1select * 2from イベントテーブル 3order by open_at desc

あとorder by はselectで使った計算式の列名をそのまま並び順に利用できるはず。

sql

1select *,case when open_at>=CURRENT_DATE then 0 else 1 end as 今日以降 2from イベントテーブル 3order by 今日以降,open_at desc

postgresでは違うのかな?

#追記
case を使えばどうとでもできます。全部書けばいいです。
1.今日以降かどうか
2.今日以降なら昇順(今日未満の日は適当に置き換え、今回はNULL)
3.今日未満なら降順(今日以降の日は適当に置き換え、今回はNULL)

sql

1create table test( 2 open_at date 3); 4 5insert into test(open_at) 6select X.open_at 7from ( 8 select cast('2018-03-16' as date) as open_at 9 union all 10 select cast('2018-03-15' as date) as open_at 11 union all 12 select cast('2018-03-14' as date) as open_at 13 union all 14 select cast('2018-03-13' as date) as open_at 15 union all 16 select cast('2018-03-12' as date) as open_at 17) as X 18 19select * 20 ,case when open_at>=CURRENT_DATE then 0 else 1 end as 今日以降かどうか 21 ,case when open_at>=CURRENT_DATE then open_at end as 今日以降日付 22 ,case when open_at>=CURRENT_DATE then null else open_at end as 今日未満日付 23from test 24order by 今日以降かどうか,今日以降日付,今日未満日付 desc

http://sqlfiddle.com/#!17/2c989/3/0

投稿2018/03/14 02:02

編集2018/03/14 04:31
sousuke

総合スコア3828

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

keng

2018/03/14 02:12

普通にorderしてしまうと 昔に終わったもの(すでに開催済みのイベント) ↓ 最近終わったもの ↓ 直近に始まるもの(未開催のイベント) ↓ さらに後に始まるもの になってしまいます。 まず過去のものと未来のものを分けてそれをorderするのかなと思うのですが、それをどうやればいいのかがわかりません。
sousuke

2018/03/14 02:19

それは昇順では?私は降順にすればと言っているのですが。 イベントが開催済みかどうかのデータ列があるんですか?
keng

2018/03/14 03:49

日付が過ぎていれば開催済みです。 3月14日を基準にすると 3月15日 3月16日 … 3月13日 3月12日 の順でソートしたいです。
sousuke

2018/03/14 04:32

若干思っていたのと違っていたので追記しました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問