Выберите только одну запись, где информация предоставлена ​​полностью и/или наименьшее значение в ней (SQL)

У меня такая ситуация. Мне нужно, чтобы код работал так, чтобы он выбирал только один 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-й

Если у кого-то может быть идея, я буду признателен.

Как вы определяете «самый старый» с этими данными? Это «самый низкий» PVLICP, упомянутый в вашем первом предложении?

JNevill 02.05.2022 17:58

@JNevil, к сожалению, это ничего не изменило.

Brianski 02.05.2022 18:15
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
0
2
37
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Предполагая, что «Самый старый» и «Самый низкий» одинаковы, вы можете использовать агрегацию:

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) самое низкое значение = самое старое.

Brianski 02.05.2022 18:15

когда вы добавляете столбцы в список выбора, а также добавляете их в предложение GROUP BY, вы фактически отключаете группировку PVLICP. Если вы не можете использовать MAX(PVRZNE) или MIN(PVRZNE) для каждого из этих добавленных столбцов (и оставить их вне предложения GROUP BY), вам следует взглянуть на «ROW_NUMBER() OVER (PARTITION BY... ЗАКАЗАТЬ) ... ГДЕ строка = 1"

Gert-Jan 02.05.2022 18:34

@Brianski Я обновил ответ, чтобы показать, как вернуть полную строку с помощью оконных функций, предложенных Гертом-Яном.

JNevill 02.05.2022 18:57

@JNevil большое спасибо. По какой-то причине у меня сейчас другая проблема, обновил вопрос.

Brianski 02.05.2022 20:43

В будущем, если вы можете, откройте новый вопрос по мере продвижения вашего кода. Таким образом, посетители Stackoverflow могут увидеть четкую исходную проблему и решение на одной странице.

JNevill 03.05.2022 15:53

Я думаю, это было бы полезно для вас

SELECT PVISBN, PVWHS, MIN(PVLICP) as PVLICP , ------------ FROM tablename WHERE PVLICP IS NOT NULL or PVLICP <> '' group by PVISBN;

Мне жаль, что этот продолжает загружаться, но никаких результатов. плюс, я думаю, что этот просто отфильтрует все пробелы. Я хочу быть уверен, что у нас есть запись, если она доступна. Если по какой-либо причине есть один PVISBN, я хочу его иметь. А если несколько, то самый низкий.

Brianski 02.05.2022 18:26

Другие вопросы по теме