Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Как убрать лишние строки / 10 сообщений из 10, страница 1 из 1
15.07.2018, 01:32
    #39674088
LisSp
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как убрать лишние строки
Привет всем!

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

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
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 DataFruit1 Fruit 2018-01-01 00:00:001 Fruit 2018-01-02 00:00:001 Fruit 2018-01-03 00:00:001 Vegetable 2018-01-05 00:00:001 Fruit 2018-01-05 00:00:00

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

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

Код: sql
1.
2.
3.
4.
SELECT Type, DataFruit
FROM TAB
GROUP BY IdFruit, Type, DataFruit
HAVING (SUM(IdFruit) OVER(PARTITION BY Type ORDER BY DataFruit))='1'
...
Рейтинг: 0 / 0
15.07.2018, 06:36
    #39674093
aleks222
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как убрать лишние строки
Код: sql
1.
2.
3.
4.
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 тоже можно..
...
Рейтинг: 0 / 0
15.07.2018, 15:18
    #39674157
iap
iap
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как убрать лишние строки
И почему же Vegetable стоит раньше, чем Fruit??
По какому, любопытно узнать, принципу?
Какой у таблицы первичный ключ? Почему его нет?
...
Рейтинг: 0 / 0
15.07.2018, 18:28
    #39674216
LisSp
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как убрать лишние строки
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
...
Рейтинг: 0 / 0
15.07.2018, 18:29
    #39674217
LisSp
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как убрать лишние строки
aleks222
Код: sql
1.
2.
3.
4.
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, то информация об этом пропала...
...
Рейтинг: 0 / 0
15.07.2018, 21:18
    #39674250
iap
iap
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как убрать лишние строки
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
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);
...
Рейтинг: 0 / 0
15.07.2018, 23:41
    #39674268
LisSp
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как убрать лишние строки
iap
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
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);



То, что нужно! Спасибо!!!
...
Рейтинг: 0 / 0
15.07.2018, 23:42
    #39674269
LisSp
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как убрать лишние строки
Всем огромное спасибо!
...
Рейтинг: 0 / 0
16.07.2018, 10:15
    #39674390
Как убрать лишние строки
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
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;
...
Рейтинг: 0 / 0
20.07.2018, 21:30
    #39677117
Naomin papa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как убрать лишние строки
LisSp,
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
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;
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Как убрать лишние строки / 10 сообщений из 10, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]