Изменить последовательность в заданном порядке - PullRequest
0 голосов
/ 22 июня 2019

У меня есть запрос, в котором я получаю список данных, как показано ниже:

, где у каждого контента есть определенная категория, и у каждой категории есть флажок для воспроизведения его на основе категории или нет.

Id  Category    content_type   Content   IsCategorywise
=====================================================
1   ABC         Image          content1  1
2   ABC         Image          content2  1
3   EFG         Video          content3  0
4   EFG         Image          content4  0
5   EFG         Image          content5  0
6   XYZ         Image          content6  1
7   XYZ         Image          content7  1

Итак, я получаю 3 группы:

Id  Category    content_type   Content   IsCategorywise
=====================================================
1   ABC         Image          content1  1
2   ABC         Image          content2  1

Id  Category    content_type   Content   IsCategorywise
=====================================================
3   EFG         Video          content3  0
4   EFG         Image          content4  0
5   EFG         Image          content5  0

Id  Category    content_type   Content   IsCategorywise
=====================================================
6   XYZ         Image          content6  1
7   XYZ         Image          content7  1

Теперь я хочу последовательность, как показано ниже, если все содержимое IsCategoryWise равно 1:

1-е содержимоепервой группы, 1-й из второй группы, 1-й из третьей группы
2-й контент первой группы, 2-й из второй группы, 2-й из третьей группы
3-й контент первой группы, 3-й из второй группы, 3-й из третьей группы

Но если какая-либо из группы категорий имеет IsCategoryWise, равную 0, то они будут в одной и той же последовательности все время:

1-е содержимое первой группы (Все 3 содержимого второй группы), 1-й из третьей группы
2-й контент первой группы, (все 3 содержимого второй группы), 2-й из третьей группы

Желаемый результат:

Id  Category    content_type   Content   IsCategorywise
=====================================================
1   ABC         Image          content1  1
3   EFG         Video          content3  0
4   EFG         Image          content4  0
5   EFG         Image          content5  0
6   XYZ         Image          content6  1

2   ABC         Image          content2  1
3   EFG         Video          content3  0
4   EFG         Image          content4  0
5   EFG         Image          content5  0
7   XYZ         Image          content7  1

Как это возможнов запросе SQL Server или в C # linq?

Ответы [ 2 ]

1 голос
/ 22 июня 2019

пожалуйста, обратитесь к комментариям в коде для объяснения

-- create sample table
declare @tbl table
(
    Id              int,
    Category        varchar(10),
    content_type    varchar(10),  
    Content         varchar(10), 
    IsCategorywise  int
)

-- insert sample data
insert into @tbl 
values
    (1,   'ABC',         'Image',          'content1',  1),
    (2,   'ABC',         'Image',          'content2',  1),
    (3,   'EFG',         'Video',          'content3',  0),
    (4,   'EFG',         'Image',          'content4',  0),
    (5,   'EFG',         'Image',          'content5',  0),
    (6,   'XYZ',         'Image',          'content6',  1),
    (7,   'XYZ',         'Image',          'content7',  1)

-- the query
; with 
-- use numbers / tally table if you have one. 
numbers as
(
    select  n = 1
    union all
    select  n = n + 1
    from    numbers
    where   n < 10
),
cte as
(
    select  *,      
            -- Group wise IsCategorywise value
            GrpCW   = min(IsCategorywise) over (partition by Category),
            -- generate row_number for GrpCW = 1 for each category order by Id
            rn  = case  when    min(IsCategorywise) over (partition by Category) = 1
                        then    row_number() over (partition by Category order by Id)
                        end
    from    @tbl
),
cte2 as
(
    select  *, 
            -- m is for repeating the GrpCW = 0 for each grouping
            m = case when GrpCW = 1 then 1 else max(rn) over () end
    from    cte
)
-- basically you want to order by "rn" but for cases where IsCategorywise = 0,
-- you want to repeat it. That is where the inner join to "numbers" comes in
select  Id, Category, content_type, Content, IsCategorywise
from    cte2 c
        inner join numbers n    on  n.n <= c.m
order by coalesce(rn, n), Category, Id

/*
Id          Category   content_type Content    IsCategorywise
----------- ---------- ------------ ---------- --------------
1           ABC        Image        content1   1
3           EFG        Video        content3   0
4           EFG        Image        content4   0
5           EFG        Image        content5   0
6           XYZ        Image        content6   1
2           ABC        Image        content2   1
3           EFG        Video        content3   0
4           EFG        Image        content4   0
5           EFG        Image        content5   0
7           XYZ        Image        content7   1
*/
0 голосов
/ 22 июня 2019
SELECT
  Id
  ,Category
  ,content_type
  ,Content
  ,IsCategorywise
FROM (

    SELECT
      Id
      ,Category
      ,content_type
      ,Content
      ,IsCategorywise
      ,ROW_NUMBER() OVER ( ORDER BY Category,Id) as orderby
    FROM myTable
    WHERE IsCategorywise=1
    UNION ALL
    SELECT
      Id
      ,Category
      ,content_type
      ,Content
      ,IsCategorywise
      ,1.5
    FROM myTable
    WHERE IsCategorywise=0
    UNION ALL
    SELECT
      Id
      ,Category
      ,content_type
      ,Content
      ,IsCategorywise
      ,3.5
    FROM myTable
    WHERE IsCategorywise=0
) X
ORDER BY orderby

Поле orderby делает правильный порядок.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...