Получить максимальное время даты в таблице с несколькими записями для каждой даты - PullRequest
0 голосов
/ 30 сентября 2019

У меня есть таблица, в которой есть

Location | IsBroken | Date
AZ          1         2019-01-01 12:00
CA          0         2019-01-01 12:00
NY          1         2019-01-01 12:00
AZ          1         2019-01-01 15:00
CA          0         2019-01-01 15:00
NY          1         2019-01-01 15:00
AZ          1         2019-01-01 19:00
CA          0         2019-01-01 19:00
NY          1         2019-01-01 19:00
AZ          1         2019-01-02 14:00
CA          0         2019-01-02 14:00
NY          1         2019-01-02 14:00
AZ          1         2019-01-02 16:00
CA          0         2019-01-02 16:00
NY          1         2019-01-02 16:00
AZ          1         2019-01-03 12:00
CA          0         2019-01-03 12:00
NY          1         2019-01-03 12:00
AZ          1         2019-01-03 17:00
CA          0         2019-01-03 17:00
NY          1         2019-01-03 17:00

И мне нужна только одна строка на дату, желательно максимум, поэтому результат должен быть

AZ          1         2019-01-01 19:00
CA          0         2019-01-01 19:00
NY          1         2019-01-01 19:00
AZ          1         2019-01-02 16:00
CA          0         2019-01-02 16:00
NY          1         2019-01-02 16:00
AZ          1         2019-01-03 17:00
CA          0         2019-01-03 17:00
NY          1         2019-01-03 17:00

Я пытался использоватьвложенный запрос, где:

WHERE foo.Date = (SELECT MAX(Date) FROM foo)

, но он возвращает мне только 1 строку.

Таблица также будет иметь непрерывные даты, как

2019-01-02 
2019-01-03

и т. д.

И мне нужны результаты для каждой даты.

Ответы [ 4 ]

1 голос
/ 30 сентября 2019

С НЕ СУЩЕСТВУЮЩИМ:

select t.* from tablename t
where not exists (
  select 1 from tablename
  where [Location] = t.[Location] 
    and convert(date, [Date]) = convert(date, t.[Date])
    and [Date] > t.[Date]
)

См. Демоверсию . Результаты:

> Location | IsBroken | Date               
> :------- | -------: | :------------------
> AZ       |        1 | 01/01/2019 19:00:00
> CA       |        0 | 01/01/2019 19:00:00
> NY       |        1 | 01/01/2019 19:00:00
> AZ       |        1 | 02/01/2019 16:00:00
> CA       |        0 | 02/01/2019 16:00:00
> NY       |        1 | 02/01/2019 16:00:00
> AZ       |        1 | 03/01/2019 17:00:00
> CA       |        0 | 03/01/2019 17:00:00
> NY       |        1 | 03/01/2019 17:00:00
0 голосов
/ 30 сентября 2019
select * 
from locations_table t
where t.col_date = (select max(col_date)
                    from locations_table)

dbfiddle

0 голосов
/ 30 сентября 2019
SELECT location, MAX(Date) 
FROM foo
GROUP BY location

Должен дать вам то, что вы хотите, я думаю, но без isBlocked, если он имеет другие значения, потому что тогда вам нужно будет добавить его в оператор group by, что сделает его большим количеством строк.

0 голосов
/ 30 сентября 2019

используйте связанный подзапрос

select t1.* from table_name t1
where t1.date= ( select max(date) from table_name t2 where t1.location=te.location and t1.date=t2.date)

, вы можете сделать это с помощью row_number (), если ваша база данных поддерживает

select * from (select *,row_number()over(partition by location,Date order by date desc) rn
from table_name
) a where a.rn=1
...