Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Как убрать лишние строки  [new]
LisSp
Member

Откуда:
Сообщений: 186
Привет всем!

Подскажите, пожалуйста, как сделать так, чтобы отобрать первое значение до его повторения и дату у него? Покажу на примере:

CREATE TABLE TAB (IdFruit int, Type nvarchar(10), DataFruit smalldatetime); 
GO
INSERT INTO TAB VALUES (1, 'Fruit', '2018-01-01'), 
                       (1, 'Fruit', '2018-01-02'), 
		       (1, 'Fruit', '2018-01-03'),   
		       (1, 'Vegetable', '2018-01-05'), 
		       (1, 'Fruit', '2018-01-05')
SELECT * FROM TAB


Получается таблица такого вида:
IdFruit Type DataFruit
1 Fruit 2018-01-01 00:00:00
1 Fruit 2018-01-02 00:00:00
1 Fruit 2018-01-03 00:00:00
1 Vegetable 2018-01-05 00:00:00
1 Fruit 2018-01-05 00:00:00


А надо вот такую:
IdFruit Type DataFruit
1 Fruit 2018-01-01 00:00:00
1 Vegetable 2018-01-05 00:00:00
1 Fruit 2018-01-05 00:00:00


Вроде бы по логике PARTITION подходит...но всё не то:

SELECT Type, DataFruit
FROM TAB
GROUP BY IdFruit, Type, DataFruit
HAVING (SUM(IdFruit) OVER(PARTITION BY Type ORDER BY DataFruit))='1'
15 июл 18, 01:32    [21571502]     Ответить | Цитировать Сообщить модератору
 Re: Как убрать лишние строки  [new]
aleks222
Member

Откуда:
Сообщений: 849
SELECT Type, DataFruit
FROM TAB as t
         outer apply( select top(1) t1.Type from TAB as t1 where t1.IdFruit = t.IdFruit and t1.DataFruit < t.DataFruit order by t1.DataFruit  desc ) as x
where not exists( select t.Type intersect select x.Type ) 


LEAD, LAG тоже можно..
15 июл 18, 06:36    [21571567]     Ответить | Цитировать Сообщить модератору
 Re: Как убрать лишние строки  [new]
iap
Member

Откуда: Москва
Сообщений: 46951
И почему же Vegetable стоит раньше, чем Fruit??
По какому, любопытно узнать, принципу?
Какой у таблицы первичный ключ? Почему его нет?
15 июл 18, 15:18    [21572006]     Ответить | Цитировать Сообщить модератору
 Re: Как убрать лишние строки  [new]
LisSp
Member

Откуда:
Сообщений: 186
iap
И почему же Vegetable стоит раньше, чем Fruit??
По какому, любопытно узнать, принципу?
Какой у таблицы первичный ключ? Почему его нет?


Да, простите. Точно!

CREATE TABLE TAB (ID int, IdFruit int, Type nvarchar(10), DataFruit smalldatetime,
CONSTRAINT [PK_TAB] PRIMARY KEY CLUSTERED
(
[Id] ASC));
GO
INSERT INTO TAB VALUES (1, 1, 'Fruit', '2018-01-01'),
(2, 1, 'Fruit', '2018-01-02'),
(3, 1, 'Fruit', '2018-01-03'),
(4, 1, 'Vegetable', '2018-01-05'),
(5, 1, 'Fruit', '2018-01-05')
SELECT * FROM TAB
15 июл 18, 18:28    [21572234]     Ответить | Цитировать Сообщить модератору
 Re: Как убрать лишние строки  [new]
LisSp
Member

Откуда:
Сообщений: 186
aleks222
SELECT Type, DataFruit
FROM TAB as t
         outer apply( select top(1) t1.Type from TAB as t1 where t1.IdFruit = t.IdFruit and t1.DataFruit < t.DataFruit order by t1.DataFruit  desc ) as x
where not exists( select t.Type intersect select x.Type ) 


LEAD, LAG тоже можно..


Там тогда получается, что когда Vegetable поменялось обратно на Fruit, то информация об этом пропала...
15 июл 18, 18:29    [21572239]     Ответить | Цитировать Сообщить модератору
 Re: Как убрать лишние строки  [new]
iap
Member

Откуда: Москва
Сообщений: 46951
DECLARE @TAB TABLE(ID int, IdFruit int, Type nvarchar(10), DataFruit smalldatetime, PRIMARY KEY CLUSTERED([Id] ASC)); 
INSERT INTO @TAB VALUES (1, 1, 'Fruit', '2018-01-01'), 
(2, 1, 'Fruit', '2018-01-02'), 
(3, 1, 'Fruit', '2018-01-03'), 
(4, 1, 'Vegetable', '2018-01-05'), 
(5, 1, 'Fruit', '2018-01-05')
SELECT * FROM @TAB;

WITH CTE AS(SELECT N=ROW_NUMBER()OVER(ORDER BY DataFruit,ID)-ROW_NUMBER()OVER(PARTITION BY Type ORDER BY DataFruit,ID),* FROM @TAB)
SELECT IdFruit,Type,DataFruit=MIN(DataFruit)
FROM CTE
GROUP BY IdFruit,Type,N
ORDER BY MIN(ID);
15 июл 18, 21:18    [21572543]     Ответить | Цитировать Сообщить модератору
 Re: Как убрать лишние строки  [new]
LisSp
Member

Откуда:
Сообщений: 186
iap
DECLARE @TAB TABLE(ID int, IdFruit int, Type nvarchar(10), DataFruit smalldatetime, PRIMARY KEY CLUSTERED([Id] ASC)); 
INSERT INTO @TAB VALUES (1, 1, 'Fruit', '2018-01-01'), 
(2, 1, 'Fruit', '2018-01-02'), 
(3, 1, 'Fruit', '2018-01-03'), 
(4, 1, 'Vegetable', '2018-01-05'), 
(5, 1, 'Fruit', '2018-01-05')
SELECT * FROM @TAB;

WITH CTE AS(SELECT N=ROW_NUMBER()OVER(ORDER BY DataFruit,ID)-ROW_NUMBER()OVER(PARTITION BY Type ORDER BY DataFruit,ID),* FROM @TAB)
SELECT IdFruit,Type,DataFruit=MIN(DataFruit)
FROM CTE
GROUP BY IdFruit,Type,N
ORDER BY MIN(ID);


То, что нужно! Спасибо!!!
15 июл 18, 23:41    [21572710]     Ответить | Цитировать Сообщить модератору
 Re: Как убрать лишние строки  [new]
LisSp
Member

Откуда:
Сообщений: 186
Всем огромное спасибо!
15 июл 18, 23:42    [21572712]     Ответить | Цитировать Сообщить модератору
 Re: Как убрать лишние строки  [new]
Собиратель мифов
Member

Откуда:
Сообщений: 10
SELECT
          p.IdFruit
         ,p.Type
         ,p.DataFruit
FROM      @TAB AS p
          LEFT OUTER JOIN @TAB AS n
            ON n.ID + 1 = p.ID
WHERE     (p.Type <> n.Type)
          OR (n.Type IS NULL)
ORDER BY  p.ID;
16 июл 18, 10:15    [21573332]     Ответить | Цитировать Сообщить модератору
 Re: Как убрать лишние строки  [new]
Naomin papa
Member

Откуда:
Сообщений: 5
LisSp,
DECLARE @TAB TABLE(ID int, IdFruit int, Type nvarchar(10), DataFruit smalldatetime, PRIMARY KEY CLUSTERED([Id] ASC)); 
INSERT INTO @TAB VALUES (1, 1, 'Fruit', '2018-01-01'), 
(2, 1, 'Fruit', '2018-01-02'), 
(3, 1, 'Fruit', '2018-01-03'), 
(4, 1, 'Vegetable', '2018-01-05'), 
(5, 1, 'Fruit', '2018-01-05')

-- create POC index Type_DataFrut_i_selected_cols
;WITH cte AS
(
SELECT bottom_rn = IIF(DATEDIFF(dd, LAG(DataFruit) OVER (PARTITION BY [Type] ORDER BY DataFruit), DataFruit) > 1, 1, 0),
       top_rn = ROW_NUMBER() OVER (PARTITION BY [Type] ORDER BY DataFruit),
       ID,
       IdFruit,
       Type,
       DataFruit
FROM @TAB
) SELECT cte.ID,
         cte.IdFruit,
         cte.Type,
         cte.DataFruit
  FROM cte
  WHERE 1 IN (cte.bottom_rn,cte.top_rn)
ORDER BY Type,
         DataFruit;


Сообщение было отредактировано: 20 июл 18, 22:11
20 июл 18, 21:30    [21590177]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить