1

假设我有一个这样的 SQL Server 表:

Event |  Item1   |  Item2  | Status
-------------------------------------------
1        Parent1   Child1      1
2        Parent1   Child2      1
3        Parent2   Child1      1
4        Parent2   Child2      1
5        Parent3   Child1      1
6        Parent3   Child2      0
7        Parent4   Child1      1
8        Parent4   Child1      1
9        Parent4   Child2      0

我想要一个给我以下信息的查询:

  1. 所有状态为 0 的行。=> 那将是 ID 6 和 9。
  2. 具有 Item2 = 'Child1'、状态为 1、具有与 #1 中的结果相同的 Item1 的所有行。=> 那将是 ID 5,7 和 8。
  3. 可以有多个匹配 #2 的行,并且匹配项应限制为基于每个项目 1 的最大 id。

所以最终的结果应该是这样的:

6, Parent3, Child2, 0
9, Parent4, Child2, 0
5, Parent3, Child1, 1
8, Parent4, Child1, 1

此解决方案在 SQL 2008 R2 中。我对临时表、联合、联接等持开放态度。我无法更改架构。非常感谢任何帮助。

4

2 回答 2

1

这应该可行,但我不知道它是否真的针对大数据进行了优化。

CREATE TABLE #tab (id int, Item1 varchar(255), Item2 varchar(255), Status bit)

INSERT INTO #tab VALUES
(1,'Parent1','Child1', 1 ),
(2,'Parent1','Child2', 1 ),
(3,'Parent2','Child1', 1 ),
(4,'Parent2','Child2', 1 ),
(5,'Parent3','Child1', 1 ),
(6,'Parent3','Child2', 0 ),
(7,'Parent4','Child1', 1 ),
(8,'Parent4','Child1', 1 ),
(9,'Parent4','Child2', 0 )

SELECT * INTO #filter FROM #tab WHERE Status = 0

SELECT * INTO #results FROM #tab 
WHERE
 Id IN (
    SELECT MAX(ID) FROM #tab 
        WHERE Item2 = 'Child1' AND Status = 1 AND Item1 IN (SELECT Item1 FROM #filter) 
        GROUP BY Item1  
 )

SELECT * FROM #filter
UNION
SELECT * FROM #results
于 2013-07-15T21:49:37.317 回答
1

这需要 sqlserver 2005

;WITH a as
(
SELECT Event, Item1, Item2, Status,
min(status) over( partition by item1) lowstatus,
max(Event) over( partition by item2, status) hievent
FROM table
)
SELECT Event, Item1, Item2, Status
FROM a
WHERE status = 0
or Item2 = 'Child1' and Status = 1 and lowstatus = 0 and hievent = Event
于 2013-07-15T22:34:50.640 回答