2013-07-29 4 views
0

У меня есть таблица, которая получает новую запись каждые 30 секунд. Мне нужно знать самую последнюю запись для каждого пользователя и значение метки времени.Как получить уникальные значения при ограничении выбора * с использованием SQL

Я написал следующий запрос:

select created_user, MAX(created_date) 
from gisadmin.FORESTRY_LOCATIONLOG_vw 
Group by created_user 

Он получает меня именно то, что я хочу. Проблема в том, что приложение, которое мне нужно ввести, предопределяет часть инструкции select для меня (пытается быть полезным).

Так ОБЯЗАТЕЛЬНО, что запрос начинается

select * from gisadmin.FORESTRY_LOCATIONLOG_vw WHERE 

Кто-нибудь есть идеи о том, как сделать эту работу

+2

Перепишите приложение. Он не должен ограничивать вас. В противном случае у вас возникнут трудности со всеми запросами :) –

+0

Это не всегда жизнеспособный вариант (по сути, он почти никогда не бывает ...) – user2366842

+0

Это программное обеспечение с полки, и повторная запись не является опцией – user1074006

ответ

3

Вы можете использовать EXISTS:

SELECT * 
FROM gisadmin.FORESTRY_LOCATIONLOG_vw 
WHERE EXISTS (SELECT * 
       FROM (SELECT created_user, MAX(created_date)'created_date' 
        FROM gisadmin.FORESTRY_LOCATIONLOG_vw 
        GROUP BY created_user) b 
       WHERE gisadmin.FORESTRY_LOCATIONLOG_vw.created_user = b.created_user 
       AND gisadmin.FORESTRY_LOCATIONLOG_vw.created_date = b.created_date) 
+0

Это возвращает 897 записей, я ожидаю, что результат будет 2-х записей, так как у меня только 2 пользователя, попавших в эту таблицу прямо сейчас. – user1074006

+0

Это странно, 897 записей для 2 пользователей? Он работает с моими тестовыми данными. –

+0

У всех записей одинаковые комбинации пользователей и дат? Если да, есть ли другое поле, которое вы могли бы использовать для дифференциации? –

0

здесь быстрое решение: Используйте его в качестве подзапроса

select created_user, MAX(created_date) 
from 
(
select * from gisadmin.FORESTRY_LOCATIONLOG_vw WHERE 1=1 //append this 
) 
Group by created_user 

Обратите внимание, что я добавил 1=1, который всегда будет оцениваться как true для обработки вашего предложения Where.

+0

делает op хочет, чтобы его запрос стал отправной точкой, а не как подзапрос? – cableload

+0

Выберите * из gisadmin.FORESTRY_LOCATIONLOG_vw ГДЕ ИМЕЕТ быть отправной точкой и не может быть изменен, потому что в приложении нет возможности изменить это, оно жестко закодировано. – user1074006

+0

@ user1074006, поэтому вы не можете писать и запускать SQL? Я думаю, вам нужно уточнить свой вопрос и объяснить вашу среду. –

-1
select * 
from gisadmin.FORESTRY_LOCATIONLOG_vw 
WHERE (something that returns no records) 

Игнорировать то, что возвращает первый запрос, а затем просто сделать свой собственный.

select created_user, MAX(created_date) 
from gisadmin.FORESTRY_LOCATIONLOG_vw 
Group by created_user 
+0

. Выберите * из gisadmin.FORESTRY_LOCATIONLOG_vw. ГДЕ ИМЕЕТ быть отправной точкой и не может быть изменен, потому что в приложении нет возможности изменить это, оно жестко закодировано. – user1074006

+0

@ user1074006 Что делать, если вы просто определяете инструкцию WHERE, которая не возвращает никаких записей, игнорирует эту часть запроса, а затем запускает отдельный? – tkendrick20

+0

возможно объединение обоих? вам нужно убедиться, что вы вытаскиваете один и тот же набор столбцов из нижнего запроса – cableload

Смежные вопросы