Как добавить метаданные в сгруппированный выбор по первичному ключу - PullRequest
0 голосов
/ 09 января 2020

У меня есть список избранного, например:

Пример данных

| key | item_id | list_name |  customer_id |meta           |
|-----|---------|-----------|--------------|---------------|
| 1   | A-11    | aa11      | 001          | unique-data-1 |
| 2   | A-11    | bb22      | 001          | unique-data-2 |
| 3   | A-26    | cc33      | 001          | unique-data-3 |
| 4   | A-28    | aa11      | 002          | unique-data-4 |
| 5   | J-52    | aa11      | 001          | unique-data-5 |
| 6   | X-53    | aa11      | 001          | unique-data-6 |

Желаемый вывод

для @item_id nvarchar(20) = 'A-11'

| key | isFavorited | list_name | meta          |
|-----|-------------|-----------|---------------|
| 1   | Y           | aa11      | unique-data-1 | 
| 2   | Y           | bb22      | unique-data-2 |
| 3   | N           | cc33      | unique-data-3 |

И хотел бы вернуть выбор всех доступных списков, а также то, является ли определенный элемент частью этого списка, с его метаданными.

declare @item_id nvarchar(20) = 'A-11'
declare @customer_id nvarchar(20) = 001

select
[key],
[isFavorited] = max(case when [item_id] = @item_id then 'Y' else 'N' end)
[list_name]
[meta]
from favorites
where customer_id = @customer_id
group by [list_name], [key], [meta]

Проблемы при попытке различных методов:

  1. Проблема, с которой я сталкиваюсь, заключается в том, что, поскольку meta уникальна, группа уничтожает уникальность выбора.

  2. Крест применяется, как показано ниже, не применяется правильный meta на основе соответствующего key.

    cross apply (
      select top 1 
      [meta]
      from favorites
       where customer_id = @customer_id
    )
    
  3. При выборе по номеру строки фактическое key, к которому необходимо присоединиться, теряется, поэтому я не могу присоединиться к meta.

    "noRow" = row_number() over(order by h_po_no asc)
    

I ' хотел бы

  1. передать item_id и customer_id
  2. вернуть все списки для этого клиента
  3. Получить статус избранного для каждого списка прошло в item_id
    • Это em помечается как избранный, если он соответствует list_name и item_id для данного customer_id
  4. Получить первичные строки key и meta data

Как я могу вернуть отдельный выбор list_name, isFavorite статуса, key, и это meta?

Ответы [ 2 ]

1 голос
/ 09 января 2020

Чтобы вернуть желаемый результат, вам не нужно вообще ничего агрегировать. Простое выражение case и предложение where будут выполнять sh this.

declare @Favorites table
(
    MyKey int
    , item_id varchar(10)
    , list_name varchar(10)
    , customer_id varchar(10)
    , meta varchar(20)
)
insert @Favorites values
(1, 'A-1', 'list-1', '001', 'unique-data-1')
, (2, 'A-1', 'list-2', '001', 'unique-data-2')
, (3, 'A-2', 'list-3', '001', 'unique-data-3')
, (4, 'A-2', 'list-1', '002', 'unique-data-1')

select *
from @Favorites

declare @item_id nvarchar(20) = 'A-1'
    , @customer_id nvarchar(20) = '001'

select f.MyKey
    , isFavorited = case when f.item_id = @item_id then 'Y' else 'N' end
    , listName = f.list_name
    , f.meta
from favorites f
where f.customer_id = @customer_id
order by f.MyKey
0 голосов
/ 10 января 2020

Параметры испытаний

declare @item_id nvarchar(20) = 'A-11'
declare @customer_id nvarchar(20) = 001

Решение

drop table if exists #tmp

;with cte as (
  select
  [key],
  [list_name],
  [rn] = row_number() over (partition by list_name order by list_name desc)
  from favorites
  where customer_id = @customer_id
  group by [list_name], [key], [meta]
)
select *
into #tmp
from cte
where [rn] = 1

select 
[i],
[json],
#t.[tmp]
from #tmp #t
inner join (
  select
  [isFavorited] = max(case when [item_id] = @item_id then 'Y' else 'N' end)
  [list_name]
  from favorites
  where customer_id = @customer_id
  group by [list_name]
) j 
on j.list_name = #t.list_name
...