2012-03-07 144 views
13
X Y DATE 
1 20 20120101 
1 21 20120101 
2 30 20120201 
3 40 20120201 
3 41 20120301 

我要选择有另一行,其中X是一样的任何行,但日期是不同的,即答案是选择是在一列同一行,但不同的另一

3 40 20120201 
3 41 20120301 
+0

的数据库和版本? – 2012-03-07 20:07:42

+0

Microsoft SQL Server 2008(SP1) - 10.0.2531.0(X64)Mar 29 2009 10:11:52 Copyright(c)1988-2008 Windows NT 6.0(Build 6002:Service Pack 2)上的Microsoft Corporation Developer Edition(64位) )....为什么? – gmaximus 2012-03-07 20:16:03

+0

因为我的sql只能从sqlserver 2008+工作。 – 2012-03-07 20:25:06

回答

20

尝试......

SELECT * 
FROM YourTable 
WHERE X IN (
    SELECT T1.X 
    FROM YourTable T1 INNER JOIN 
     YourTable T2 ON T1.X = T2.X 
    WHERE T1.DATE <> T2.DATE 
); 

这应该在最符合ANSI标准的数据库产品的工作。

+0

这是一个工作答案,由我的供应商的SQL实现不允许嵌套选择 - 但我明白帮助 – gmaximus 2012-03-07 20:19:13

+0

我其实觉得我还是有点困惑,你能给出答案只是上面的x和y列这个问题'具有相同的Y和不同的X'? – gmaximus 2012-03-07 20:54:43

+2

@gmaximus:你用sql-server-2008标记了你的问题,并且你说你使用的是SQL Server 2008.那么当你说你的供应商的sql实现不允许嵌套选择时,你是什么意思? SQL Server 2008绝对允许嵌套选择。 – 2012-03-08 05:53:15

2
select distinct t1.* 
    from table t1 
    join table t2 
    on (t1.X = t2.X and t1.date <> t2.date); 
+0

@Yuck我没有机会测试它,但你确定吗?在我看来,这个查询应该给出所需的结果。 – 2012-03-07 19:53:53

+0

@Yuck我测试了它,它工作正常。 – 2012-03-07 20:13:38

+0

'table'是一个SQL关键字,它会阻止它运行。你真的跑什么来测试?哪个RDBMS? – Yuck 2012-03-07 20:20:18

0
declare @t table(X int, Y int, DATE CHAR(8)) 
insert @t values 
(1, 20, '20120101'), 
(1, 21, '20120101'), 
(2, 30, '20120201'), 
(3, 40, '20120201'), 
(3, 41, '20120301') 

select x,y, date, maxy, miny from 
(
    select *, max(date) over (partition by x) maxdate, 
    min(date) over (partition by x) mindate 
    from @t 
) a 
where mindate <> maxdate