Сравнение столбцов между строками одной и той же группы, используемой в предложении Partition By

Я хочу сравнить одни и те же столбцы строк, попадающие в одну и ту же группу, созданную с помощью раздела по предложению в SQL. Моя таблица содержит данные ниже:

Id  Serial_Number   Last_update_date    Flag
1   3344            07-05-2024          N
2   3344            02-05-2024          N
3   9098            20-02-2024          Y
4   9098            20-02-2024          Y
5   2323            07-03-2023          Y
6   2323            17-10-2023          Y
7   2323            17-10-2023          Y
8   1894            10-07-2022          N
9   1894            20-02-2024          N
10  1894            02-05-2024          N

В приведенных выше данных группировка должна выполняться по столбцу Serial_Number и проверять, совпадают ли какие-либо две даты в пределах серийного_номера, флаг для всех членов группы должен быть Y, в противном случае все должны быть N. Я попробовал использовать count(distinct last_update_date) over partition by serial_number, но это не работает.

with cte as (
  select a.*, count(distinct last_update_date) 
                   over (partition by serial_number) as cnt
  from my_table a
)
select * from cte 

Возможно, мы могли бы использовать эту скрипту для совместной работы над решением dbfiddle.uk/rRvXt-uM

Bart McEndree 09.05.2024 20:52

Что-то вроде: select case when max(cnt) over(partition by serialnumber) > 1 THEN 'Y' ELSE 'N' END, * FROM (select *, COUNT(*) OVER(PARTITION BY Serial_number, last_update_date) AS cnt FROM yourtable) x

siggemannen 09.05.2024 21:00

@siggemannen, почему ты рассчитываешь Флаг? Флаг уже является частью исходных данных.

Bart McEndree 09.05.2024 21:08

@BartMcEndree, я читал, что флаг — это ожидаемое значение, которое он ищет :)

siggemannen 09.05.2024 21:12

@Мохаммед Ариф, пожалуйста, уточните исходные данные и ожидаемые результаты в виде отдельных таблиц.

Bart McEndree 09.05.2024 21:14
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
0
5
58
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

WITH CTE as
(
SELECT Serial_number, count(*) as DateCount
FROM my_table
GROUP BY Serial_number, Last_update_date
HAVING Count(*) > 1  
)
SELECT m.*, 
  CASE WHEN DateCount > 1 THEN 'Y' ELSE 'N' END as CalculatedFlag
FROM my_table m
LEFT JOIN CTE on CTE.Serial_number=m.Serial_number

рабочий пример

Идентификатор Серийный номер Дата последнего_обновления Флаг Вычисленный флаг 1 3344 07-05-2024 Н Н 2 3344 05.02.2024 Н Н 3 9098 20-02-2024 Да Да 4 9098 20-02-2024 Да Да 5 2323 03.07.2023 Да Да 6 2323 17-10-2023 Да Да 7 2323 17-10-2023 Да Да 8 1894 г. 07.10.2022 Н Н 9 1894 г. 20-02-2024 Н Н 10 1894 г. 05.02.2024 Н Н
Ответ принят как подходящий

Если любые две даты в разделе равны, то max(dense_rank()) < count(*) для этого раздела.

with cte as (
  select a.*
    ,dense_rank()over (partition by serial_number order by last_update_date) as rnk
  from my_table a
)
select * 
  ,case when max(rnk)over(partition by serial_number)
               < count(*)over(partition by serial_number) 
       then 'Y' 
   else 'N' 
   end flag
from cte 
order by id
Идентификатор Серийный номер Дата последнего_обновления рнк флаг max_rnk CNT 1 3344 07.05.2024 2 Н 2 2 2 3344 2024-05-02 1 Н 2 2 3 9098 20 февраля 2024 г. 1 Да 1 2 4 9098 20 февраля 2024 г. 1 Да 1 2 5 2323 07.03.2023 1 Да 2 3 6 2323 2023-10-17 2 Да 2 3 7 2323 2023-10-17 2 Да 2 3 8 1894 г. 10.07.2022 1 Н 3 3 9 1894 г. 20 февраля 2024 г. 2 Н 3 3 10 1894 г. 2024-05-02 3 Н 3 3

демо

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