Соединение с другой строкой таблицы, которая имеет максимальную строку - PullRequest
0 голосов
/ 17 апреля 2020

У меня есть следующая структура таблицы:

CREATE TABLE Orders(OrderID INT);
INSERT INTO Orders(OrderID)
VALUES (1),(2),(3)

CREATE TABLE Scenarios(ScenarioID INT, OrderID INT, SequenceNo INT, Title NVARCHAR(100));
INSERT INTO Scenarios(ScenarioID,OrderID,SequenceNo,Title)
VALUES
--Order 1
(10,1,1,'Basic'),
(11,1,2,'Main'),

--Order 2
(12,2,1,'Basic'),
(13,2,2,'Main'),

--Order 3
(14,3,1,'Basic'),
(15,3,2,'Main')



CREATE TABLE Responses(ResponseID INT, OrderID INT, ScenarioID INT);
INSERT INTO Responses VALUES 
--Order 1
(100, 1,10), -- BASIC
(101, 1,10),-- BASIC

--Order 2
(102, 2,12),-- BASIC
(103, 2,12),-- BASIC
(104, 2,13),-- MAIN

-- Order 3
(105, 3,14),-- BASIC
(106, 3,14),-- BASIC
(107, 3,15)-- MAIN

И у меня есть следующий запрос, который дает мне правильный результат. но это не оптимизировано. Это занимает много времени с 1M записей, даже при правильном индексировании

SELECT  
    s.Title,
    COUNT(DISTINCT(o.OrderID)) AS [Count]
FROM Orders o
JOIN Responses r
    ON r.OrderID = o.OrderID
JOIN Scenarios s
    ON s.ScenarioID = r.ScenarioID
WHERE 
r.ScenarioID = (SELECT TOP 1 s1.ScenarioID
                FROM Scenarios s1
                JOIN Responses r1 on r1.ScenarioID = s1.ScenarioID
                WHERE s1.OrderID = o.OrderID
                ORDER BY s1.SequenceNO DESC)
GROUP BY s.Title

В основном я хочу объединить таблицу Responses с таблицей Scenarios только в одной строке, где столбец Scenario.SequenceNo равен MAX.

Вот мой SQL Скрипка

Ожидаемый выход

Title   Count
Basic   1
Main    2

1 Ответ

1 голос
/ 17 апреля 2020

С ROW_NUMBER() оконной функцией:

WITH cte AS (
  SELECT o.OrderId, s.Title, 
    ROW_NUMBER() OVER (PARTITION BY o.OrderID ORDER BY s.SequenceNo DESC) rn
  FROM Orders o
  INNER JOIN Responses r ON r.OrderID = o.OrderID
  INNER JOIN Scenarios s ON s.ScenarioID = r.ScenarioID
)
SELECT Title, COUNT(*) Count 
FROM cte
WHERE rn = 1
GROUP BY Title

См. Демоверсию . Результаты:

> Title | Count
> :---- | ----:
> Basic |     1
> Main  |     2
...