Сравнивая 2 таблицы - PullRequest
       2

Сравнивая 2 таблицы

0 голосов
/ 12 декабря 2018

У меня есть таблица, в которой у меня есть все идентификаторы, и вторая таблица, в которой у меня есть идентификаторы, в которых произошла ошибка в процессе.Мне нужен мой запрос, чтобы выбрать последние 3 идентификатора до того, как произошла ошибка.Например:

first table:
id     |   info
___________________
100    |     1.0             
101    |     2.0                      
102    |     6.0             
103    |     9.0         
104    |     15.0         
105    |     8.0       
106    |     6.0
107    |     8.0       
108    |     6.0
109    |     8.0       
110    |     6.0



id of errors:

id        
____                                                              
104                 
110    

Таким образом, этот запрос должен будет вернуть значения для идентификаторов: 109,108,107,103,102 и 101

Заранее спасибо

Ответы [ 3 ]

0 голосов
/ 12 декабря 2018
SELECT result.*
FROM errors e
CROSS APPLY (
    SELECT TOP 3 * 
    FROM [first table] ft 
    WHERE ft.id < e.id 
    ORDER BY ft.id DESC
) result
0 голосов
/ 12 декабря 2018

Это может работать для вас:

Настройка:

Create Table #Errs
(
Id Int
);

Insert Into #Errs Values
(104), (110)

Create Table #tbl
(
Id Int,
Info Decimal(6,2)
);

Insert Into #tbl Values
(100,1.0),
(101,2.0),
(102,6.0),
(103,9.0),
(104,15.0),
(105,8.0),
(106,6.0),
(107,8.0),
(108,6.0),
(109,8.0),
(110,6.0)

Запрос

With cte As
(
   Select 
      Id,
      LAG(Id,1,Null) OVER(Order By Id) As iderror1,
      LAG(Id,2,Null) OVER(Order By Id) As iderror2,
      LAG(Id,3,Null) OVER(Order By Id) As iderror3 
   From #tbl t
) 
Select iderror1 As ErrorList From cte Where Id In (Select Id From #Errs)
Union ALL
Select iderror2 As ErrorList From cte Where Id In (Select Id From #Errs)
Union ALL
Select iderror3 As ErrorList From cte Where Id In (Select Id From #Errs)
Order By ErrorList

Если ваши идентификаторы не в последовательном порядке, вы можете использовать (ВыбратьNULL) как ниже:

With cte As
(
   Select 
      Id,
      LAG(Id,1,Null) OVER(Order By (Select NULL)) As iderror1,
      LAG(Id,2,Null) OVER(Order By (Select NULL)) As iderror2,
      LAG(Id,3,Null) OVER(Order By (Select NULL)) As iderror3 
   From #tbl t
) 
Select iderror1 As ErrorList From cte Where Id In (Select Id From #Errs)
Union ALL
Select iderror2 As ErrorList From cte Where Id In (Select Id From #Errs)
Union ALL
Select iderror3 As ErrorList From cte Where Id In (Select Id From #Errs)
Order By ErrorList

Результаты

ErrorList
--------
101
102
103
107
108
109
0 голосов
/ 12 декабря 2018

Вы можете использовать оконную функцию для вычисления группы помощников SUM() и ROW_NUMBER(), чтобы получить 3 последние строки:

WITH cte AS (
  SELECT t1.*, -sub.c+ SUM(sub.c) OVER(ORDER BY t1.id) AS grp
  FROM t1
  LEFT JOIN t2
    ON t1.id = t2.id
  CROSS APPLY (SELECT CASE WHEN t2.id IS NULL THEN 0 ELSE 1 END) sub(c)
), cte2 AS (
  SELECT *, ROW_NUMBER() OVER(PARTITION BY grp ORDER BY id DESC) rn
  FROM cte
)
SELECT id, info
FROM cte2
WHERE rn BETWEEN 2 AND 4
ORDER BY id;

db <> fiddle demo

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