やりたいこと
name | year | salary |
---|---|---|
tanaka | 2019 | 2000 |
tanaka | 2018 | 1800 |
suzuki | 2019 | 2000 |
suzuki | 2018 | 1900 |
satou | 2018 | 2000 |
上記のようなテーブルのデータがあった際に、
yearを入力させて、name毎に入力値yearに一番近い年の情報を取りたいです。
例えば、year=2019を入力したら、以下のデータを取得したいです。
name | year | salary |
---|---|---|
tanaka | 2019 | 2000 |
suzuki | 2019 | 2000 |
satou | 2018 | 2000 |
調べてみましたがやり方が分かりませんでした。
どなたか知っている方おりましたら、ご教授いただけないでしょうか。
また、goのsqlboilerのパッケージを使用しているのですが、そちらの記述方法もできれば、合わせてご教授いただければ幸いです。
よろしくお願いいたします。
環境
mysql5.7
go1.9
sqlboiler
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答3件
0
皆さんご回答ありがとうございました。
回答を参考にさせていただき、何とか解決できました。
SQL
1 2mysql> select * from salary; 3+------+--------+------+--------+ 4| id | name | year | salary | 5+------+--------+------+--------+ 6| 1 | tanaka | 2019 | 1000 | 7| 2 | tanaka | 2018 | 1000 | 8| 3 | suzuki | 2019 | 1000 | 9| 4 | suzuki | 2018 | 100 | 10| 5 | satou | 2018 | 100 | 11+------+--------+------+--------+ 125 rows in set (0.00 sec) 13 14mysql> select t1.* from salary as t1 inner join (select max(name) as max_name, min(abs(year - 2020)) as diff_year from salary group by name) as t2 on t1.name = t2.max_name and abs(t1.year - 2020) = diff_year; 15+------+--------+------+--------+ 16| id | name | year | salary | 17+------+--------+------+--------+ 18| 1 | tanaka | 2019 | 1000 | 19| 3 | suzuki | 2019 | 1000 | 20| 5 | satou | 2018 | 100 | 21+------+--------+------+--------+
投稿2019/03/03 13:21
総合スコア14
0
ベストアンサー
カラムのyearが数値型であれば、入力値との差分を計算してその絶対値が最小のレコードを取得でいけると思います。
追記
申し訳ありません。単純に考えていましたが副問い合わせが必要な気がしてきました。
SQLを書いてみました。
SQL
1SELECT t1.*,MIN(ABS(t1.year - 2020)) AS diff_year 2 FROM salary t1 3 INNER JOIN 4 ( 5 SELECT MAX(name) AS max_name,MIN(ABS(year - 2020)) AS diff_year 6 FROM salary 7 GROUP BY name 8 ) t2 9 ON t1.name = t2.max_name AND MIN(ABS(t1.year - 2020)) = t2.diff_year 10 ORDER BY t1.diff_year ASC;
久しぶりなのと検証環境が手元にないのでエラーがでたらすみません。
投稿2019/03/03 06:23
編集2019/03/03 09:07総合スコア1088
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/03/03 07:23
2019/03/03 08:21
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。