2016-02-16 4 views
1

RDBMS = Microsoft SQL ServerSQL Server - Только Выберите самую последнюю дату

Я работаю в холодильном компании, и мы хотим, чтобы сделать лучшую работу по отслеживанию стоимости бутылки хладагента куплены для каждого места инвентаризации. Я пытаюсь создать SQL-запрос, который извлекает эту информацию, но я сталкиваюсь с некоторыми проблемами. Для каждого местоположения инвентаря я хочу отобразить последний из стоимости хладагента, который был куплен для этого местоположения инвентаря. Я хочу увидеть последнюю дату, когда у нас есть запись для этого местоположения, покупающего определенный хладагент. Я пробовал использовать функцию Max безуспешно и функцию Row_Number, которой я не смог получить работу. Любая помощь приветствуется.

См. Ниже образец кода, который я пытаюсь получить только для отображения последней даты. Каждое место инвентаря приобрело R-22 30-фунтовый кувшин.

select 
    lctn_id as Location, 
    invntryitm_id as InventoryItemID, 
    invntryitm_nme as InventoryItemName, 
    prchseordrlst_dte_rqstd as DateRequested, 
    prchseordrlst_unt_cst as UnitCost 
from 
    invntryitm 
join 
    prchseordrlst on prchseordrlst.invntryitm_rn = invntryitm.invntryitm_rn 
join 
    prchseordr on prchseordr.prchseordr_rn = prchseordrlst.prchseordr_rn 
join 
    lctn on lctn.lctn_rn = prchseordr.lctn_rn 
where 
    invntryitm.invntryitm_nme ='REFRIGERANT R-22 30#' 
    and lctn_obslte = 'N' 
group by 
    lctn.lctn_id, invntryitm.invntryitm_id, invntryitm.invntryitm_nme, 
    prchseordrlst.prchseordrlst_unt_cst 
order by 
    lctn_id 
+0

Почему вы не смогли заставить функцию row_number работать? Вы получили сообщение об ошибке? Пожалуйста, разместите свою попытку, чтобы мы могли ее отладить. –

+0

Честно говоря, я никогда раньше не использовал функцию row_number, и я этого не понимал. –

ответ

2

Я думаю, что аналитическая функция/оконная даст вам то, что вам нужно:

with location_data as (
    select 
    lctn_id as Location, 
    invntryitm_id as InventoryItemID, 
    invntryitm_nme as InventoryItemName, 
    prchseordrlst_dte_rqstd as DateRequested, 
    prchseordrlst_unt_cst as UnitCost, 
    max (prchseordrlst_dte_rqstd) over (partition by lctn_id) as max_date 
    from 
    invntryitm 
    JOIN prchseordrlst on prchseordrlst.invntryitm_rn = invntryitm.invntryitm_rn 
    JOIN prchseordr on prchseordr.prchseordr_rn = prchseordrlst.prchseordr_rn 
    JOIN lctn on lctn.lctn_rn = prchseordr.lctn_rn 
    where 
    invntryitm.invntryitm_nme ='REFRIGERANT R-22 30#' and 
    lctn_obslte = 'N' 
) 
select * 
from location_data 
where max_date = DateRequested 
order by Location 

Имейте в виду, что если есть галстук, два LOCATION_ID записи с той же датой, то вы получите оба они вернулись. Если это вопрос, то вы, вероятно, хотите row_number() вместо max():

row_number() over (partition by lctn_id order by prchseordrlst_dte_rqstd desc) as rn 

И тогда вы

where rn = 1 

получить первую строку

Причина я не перечислял row_number() во-первых, max - это O (n), и если ваши данные имеют даты и время, этого может быть достаточно для того, что вам нужно.

+0

Большое вам спасибо! Оба эти решения отлично работали. –

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