простой sql (надеюсь!) - PullRequest
       32

простой sql (надеюсь!)

1 голос
/ 08 апреля 2019

Учитывая набор данных, подобный этому:

ccy | time | fxrate
GBP | 11   | 1.2
EUR | 21   | 1.4
CHF | 9    | 3.1
GBP | 15   | 1.1
EUR | 20   | 1.5
CHF | 1    | 3.0
CHF | 7    | 3.0
GBP | 20   | 1.9

Я хочу получить последние fxrates (по 'времени') для каждого ccy:

ccy | time | fxrate
GBP | 20   | 1.9
EUR | 21   | 1.4
CHF | 9    | 3.1

Возможно липолучить эти данные с помощью одного запроса SQL?Мои навыки подводят меня.Я предполагаю, что мне нужно GROUP BY ccy ..?где макс (время) ..?LIMIT 1 ..?Помогите!

[РЕДАКТИРОВАТЬ] используя postgresql

Ответы [ 4 ]

4 голосов
/ 08 апреля 2019

Да, вы можете использовать group by только для максимальной скорости передачи, но в вашем случае вам нужен коррелированный подзапрос:

select t.*
from table t
where t.fxrate = (select max(t1.fxrate) from table t1 where t1.ccy = t.ccy);

В postgresql вы можете сделать:

select distinct on (ccy) *
from table t
order by t.fxrate desc;
2 голосов
/ 08 апреля 2019

Вы также можете использовать внутреннее объединение для подзапроса для максимальной группы времени ccy

select m.ccy, m.time, m.fxrate 
from my_table  m
inner join  (
  select ccy, max(time) max_time  
  from my_table  
  group by ccy
) t on t.ccy = m.ccy and t.max_time = m.time
2 голосов
/ 08 апреля 2019

row_number может быть полезным

select * from (select *,row_number()over(partition by ccy order by time desc) rn
from table_name
) a where a.rn=1
1 голос
/ 08 апреля 2019
select ccy , time ,fxrate 
from mytable
Inner join(SELECT max(time) maxtime, ccy
            FROM  mytable
            group by ccy ) MAXCCY on maxccy.maxtime = mytable.time and MAXCCY.ccy = mytable.ccy
...