1

我想在 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

有任何想法吗?

4

5 回答 5

2

您似乎假设按 [Column 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' 等。如果在 [Column A] 中有超过两行具有相同值的行,您可能会发现结果出乎意料。

请注意,前两个比较是连接条件的一部分,第三和第四个比较是 WHERE 子句的一部分。

更新:

满足更改的要求:可能有 20 行 [Column A] = 'Ex1'。返回 [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)
于 2013-07-09T14:49:54.330 回答
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    
于 2013-07-09T15:24:54.720 回答
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 中的值已填写,并且实际上没有您在示例中显示的空值。

于 2013-07-09T14:44:04.887 回答
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 演示

于 2013-07-09T14:49:06.927 回答
-1
select * from table where C = 
(select MIN(D) from table) 
AND 
(select * from table where D = (select MAX(D) from table))

null 表示假,否则为真

于 2013-07-09T14:42:06.170 回答