Ищите решение для извлечения 1 или макс значения из таблицы в SQL - PullRequest
0 голосов
/ 06 июля 2018
Table A 
Owner   row_no   category
A        1         U
B        1         T
B        2         T
C        1         U
C        2         T
C        3         U
C        4         U

Я ищу решение, которое сохраняет значения в другой таблице, которая должна получить

  1. row_no как 1, если значение равно 1 и должно возвращать max (row_no) -1, если значение не равно 1.
  2. категория должна быть либо T, либо U, либо обе в зависимости от того, является ли владелец выбрал только T или U или оба в ТАБЛИЦЕ A.

Результирующая таблица должна выглядеть примерно так:

Table B 
Owner   row_no   category
A        1         U
B        1         T
C        3        Both

Я попытался использовать следующий подход, который оказался ошибкой.

SELECT * INTO B FROM A
WHERE 
ROW_NO LIKE CASE
WHEN ROW_NO=1 then ROW_NO
ELSE max(ROW_NO)-1
END

Еще не выяснили при поиске категории!

Не могли бы вы помочь с правильным подходом ?!

НОВОЕ РЕДАКТИРОВАНИЕ

Ответы [ 2 ]

0 голосов
/ 06 июля 2018

Я думаю, вы можете сделать так:

declare @table table (owner nvarchar(50),row_no int)

insert into @table

values

('A',       1),
('B',       1),
('B',       2),
('C',       1),
('C',       2),
('C',       3),
('C',       4)

select owner,row_no from (
select *, ROW_NUMBER() over(partition by owner order by la desc) as rn from (
select *,LEAD(row_no,1,1) over(partition by owner order by row_no) as la from @table
)X 
)z where rn = 1

ИЗМЕНИТЬ ОБНОВЛЕНИЕ

С CategoryList вы можете сделать это

declare @table table (owner nvarchar(50),row_no int,category nvarchar(50))

insert into @table

values

('A',       1,'U'),
('B',       1,'T'),
('B',       2,'T'),
('C',       1,'U'),
('C',       2,'T'),
('C',       3,'U'),
('C',       4,'U')

;
with category as (
select owner,  categoryList = stuff((select  N', ' + Category
from (Select distinct owner,category from  @table t2
) z
where z.owner  = t1.owner 
FOR XML PATH(N''), TYPE).value(N'.[1]', N'nvarchar(max)'), 1, 2, N'')
from @table t1
group by owner 
)


select z.owner,row_no,y.categoryList from (
select *, ROW_NUMBER() over(partition by owner order by la desc) as rn from (
select *,LEAD(row_no,1,1) over(partition by owner order by row_no) as la from @table
)X 
)z 
inner join category y on z.owner = y.owner
where rn = 1

DBFiddeldemo

0 голосов
/ 06 июля 2018

Вы можете использовать:

WITH cte AS(
  SELECT *, MAX(row_no)OVER(PARTITION BY owner) AS m
  FROM tab
)
SELECT owner, row_no
INTO tab2
FROM cte
WHERE row_no = m-1 OR m=1;

Демоверсия DBFiddle

Внимание! Я сделал предположение, что значения в row_no являются последовательными.


Без cte / подзапроса:

SELECT TOP(1) WITH TIES *
INTO tabB
FROM tab
ORDER BY IIF(MAX(row_no)OVER(PARTITION BY owner) IN (row_no+1,1),0,1)

DBFiddle Demo2

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