【问题标题】:Joining with another table row that has max row加入另一个具有最大行的表行
【发布时间】:2020-07-30 07:50:06
【问题描述】:

我的表结构如下:

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

我有以下查询,它给了我正确的结果。但它没有优化。即使有正确的索引,它也需要很长时间才能处理 100 万条记录

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

基本上,我只想在Scenario.SequenceNo 列为MAX 的单行上加入Responses 表和Scenarios 表。

这里是我的SQL Fiddle

预期输出

Title   Count
Basic   1
Main    2

【问题讨论】:

  • 你的预期输出是什么?
  • @forpas 看到我上面的更新

标签: sql-server tsql sql-server-2012


【解决方案1】:

带有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

请参阅demo
结果:

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

【讨论】:

    猜你喜欢
    • 2021-04-21
    • 1970-01-01
    • 2015-01-14
    • 1970-01-01
    • 1970-01-01
    • 2019-04-18
    • 2011-07-17
    • 2013-08-15
    • 2012-01-20
    相关资源
    最近更新 更多