我想查找A列中的所有记录,其中,在按升序排序C列之后,D列以不同于最早日期的值开始。
从下面的示例中,我希望它返回Ex2和Ex3的记录,而不是返回Ex1的记录。
修订更新/要求:
1)我希望它按A列分组并按C列排序。
2)我想在A列中找到所有记录,其中D列中的第一个值不是最低日期。
Column A Column B Column C Column D
-------- -------- -------- --------
Ex1 Title A 1 2003/1/1
Ex1 Title B 2 2003/2/2
Ex2 Title C 3 2004/4/4
Ex2 Title D 4 2004/3/3
Ex3 Title E 5 2005/6/6
Ex3 Title F 6 2005/5/5
任何想法?
答案 0 :(得分:2)
您似乎假设按[B列]排序,您可以在自联接中明确说明:
SELECT t1.[Column A], t1.[Column B], t1.[Column C], t1.[Column D]
FROM YourTableName t1
JOIN YourTableName t2
ON t2.[Column A] = t1.[Column A]
AND t2.[Column B] > t1.[Column B]
WHERE t2.[Column C] > t1.[Column C]
AND t2.[Column D] < t1.[Column D]
这假设恰好有两行[Column A] ='Ex1'等。如果在[A列]中有两个以上具有相同值的行,您可能会发现结果是意外的。
请注意,前两个比较是连接条件的一部分,第三个和第四个比较是WHERE子句的一部分。
更新:
努力改变要求:[Column A] ='Ex1'可能有20行。返回[Column A]的不同值,其中[Column C]的最低值与[Column D]的最低值不在同一行。 [B栏]无关紧要。
SELECT DISTINCT t1.[Column A]
FROM YourTableName t1
JOIN
(SELECT [Column A], MIN([Column C]) AS MinC, MIN([Column D]) AS MinD
FROM YourTableName
GROUP BY [Column A]) t2
ON t2.[Column A] = t1.[Column A]
WHERE t1.[Column C] = t2.MinC
AND t1.[Column D] <> t2.MinD
返回:
Column A
Ex1
对于以下测试表:
CREATE TABLE YourTableName
([Column A] VARCHAR(50),
[Column B] VARCHAR(50),
[Column C] INT,
[Column D] INT)
测试数据:
INSERT INTO YourTableName
([Column A], [Column B], [Column C], [Column D])
VALUES ('Ex1', 'Title A', 1, 2)
INSERT INTO YourTableName
([Column A], [Column B], [Column C], [Column D])
VALUES ('Ex1', 'Title B', 2, 1)
INSERT INTO YourTableName
([Column A], [Column B], [Column C], [Column D])
VALUES ('Ex1', 'Title C', 3, 1)
答案 1 :(得分:1)
新答案专门针对以下规范(现在似乎包含问题):
更新:我希望它按A列分组并按C列排序。
更新#2:我想从A列返回所有示例 D列中的“第一”值不是最低值。
SELECT a.*
FROM tableName a
WHERE a.columnD <> (
SELECT min(columnD)
FROM tableName b
WHERE a.columnA=b.columnA
)
ORDER BY a.columnC
答案 2 :(得分:0)
这种技术称为“自我加入”。
SELECT a.*
FROM tableName a, tableName b
WHERE a.column_a = b.column_a
AND a.column_c < b.column_c
AND a.column_d > b.column_d
这假定column_a中的值被填充,并且实际上没有如您在示例中显示的那样。
答案 3 :(得分:0)
使用排名功能,可以这样做:
SELECT * FROM
(
SELECT
*
, ROW_NUMBER() OVER (PARTITION BY ColumnA ORDER BY ColumnC) AS RankC
, ROW_NUMBER() OVER (PARTITION BY ColumnA ORDER BY ColumnD) AS RankD
FROM MyTable
) x
WHERE RankC <> RankD
<强> SQLFiddle DEMO 强>
答案 4 :(得分:-1)
select * from table where C =
(select MIN(D) from table)
AND
(select * from table where D = (select MAX(D) from table))
null表示错误 否则是真的