У меня такая ситуация. Мне нужно, чтобы код работал так, чтобы он выбирал только один PVISBN (номер элемента) на основе PVLICP (номерной знак) (мне нужно получить только первую строку из 2, которые я возвращаю).
TableSeven AS (
SELECT PVISBN, PVWHS, PVLICP, PVRZNE, PVRLOC, PVAZNE, PVALOC, PVLPRG,
ROW_NUMBER() OVER (PARTITION BY PVISBN, PVRZNE ORDER BY PVLICP --, PVRLOC, PVAZNE, PVALOC, PVLPRG
ASC) AS rn
FROM [REPIT].[LEVYDTA].[WHSPDVT]
WHERE PVSPDT BETWEEN @Last2WeekDATE AND @LWDate
--AND PVISBN='0164556221'
) ,
TableTwelve AS (
SELECT PVISBN, PVWHS, PVLICP, PVRZNE, PVRLOC, PVAZNE, PVALOC, PVLPRG, rn
FROM TableSeven
WHERE rn = 1
),
Я продолжаю получать 2 строки и должен получить только 1-й
Если у кого-то может быть идея, я буду признателен.
@JNevil, к сожалению, это ничего не изменило.
Предполагая, что «Самый старый» и «Самый низкий» одинаковы, вы можете использовать агрегацию:
SELECT PVISBN, MIN(PVLICP) as PVLICP
FROM yourtable
GROUP BY PVISBN;
К вашему комментарию: если вы хотите, чтобы все столбцы выводились, рассмотрите оконные функции (также называемые функциями аналитики или функциями упорядоченной аналитики), чтобы помочь определить min()
для группы/окна (в данном случае PVISBN
), а затем отфильтровать:
SELECT *
FROM
(
SELECT yourtable.*, ROW_NUMBER() OVER (PARTITION BY PVISBN ORDER BY PVLICP ASC) as rn
FROM yourtable
) dt
WHERE rn = 1;
Это создаст row_number, начиная с 1 для каждой строки для каждого отдельного PVISBN
(вы можете запустить только подзапрос, чтобы увидеть, как это выглядит). Затем мы просто фильтруем rn
из 1
, что будет записью для этого PVISBN
с наименьшим PVLICP
.
@JNvill ничего не делает. Там хранятся все записи. Если я выберу SELECT PVISBN, PVWHS, MIN(PVLICP), PVRZNE, PVRLOC, PVAZNE, PVALOC, PVLPRG. Проблема заключается не только в MIN, но и в том, что он должен хранить только 1 запись, где 1) есть значение 2) самое низкое значение = самое старое.
когда вы добавляете столбцы в список выбора, а также добавляете их в предложение GROUP BY, вы фактически отключаете группировку PVLICP. Если вы не можете использовать MAX(PVRZNE) или MIN(PVRZNE) для каждого из этих добавленных столбцов (и оставить их вне предложения GROUP BY), вам следует взглянуть на «ROW_NUMBER() OVER (PARTITION BY... ЗАКАЗАТЬ) ... ГДЕ строка = 1"
@Brianski Я обновил ответ, чтобы показать, как вернуть полную строку с помощью оконных функций, предложенных Гертом-Яном.
@JNevil большое спасибо. По какой-то причине у меня сейчас другая проблема, обновил вопрос.
В будущем, если вы можете, откройте новый вопрос по мере продвижения вашего кода. Таким образом, посетители Stackoverflow могут увидеть четкую исходную проблему и решение на одной странице.
Я думаю, это было бы полезно для вас
SELECT PVISBN, PVWHS, MIN(PVLICP) as PVLICP , ------------ FROM tablename WHERE PVLICP IS NOT NULL or PVLICP <> '' group by PVISBN;
Мне жаль, что этот продолжает загружаться, но никаких результатов. плюс, я думаю, что этот просто отфильтрует все пробелы. Я хочу быть уверен, что у нас есть запись, если она доступна. Если по какой-либо причине есть один PVISBN, я хочу его иметь. А если несколько, то самый низкий.
Как вы определяете «самый старый» с этими данными? Это «самый низкий» PVLICP, упомянутый в вашем первом предложении?