1

列 A のすべてのレコードを検索したいのですが、列 C を昇順で並べ替えた後、列 D は最も早い日付以外の値で始まります。

以下の例から、Ex2 と Ex3 のレコードを返し、Ex1 のレコードを返さないでほしいと思います。

改訂された更新/要件:

1) 列 A でグループ化し、列 C で並べ替え
ます。2) 列 D の最初の値が最も低い日付ではない列 A のすべてのレコードを検索します。

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

[列 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' などの行が正確に 2 つ存在することを前提としています。[Column A] に同じ値を持つ行が 2 つ以上ある場合、予期しない結果になる可能性があります。

最初の 2 つの比較は結合条件の一部であり、3 番目と 4 番目の比較は WHERE 句の一部であることに注意してください。

アップデート:

変更された要件への対応: [Column A] = 'Ex1' の行が 20 行ある場合があります。[列 C] の最小値が [列 D] の最小値と同じ行にない [列 A] の個別の値を返します。【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: 列 D の「最初の」値が最小値ではない列 A からすべての例を返したいと思います。

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 の値が入力されており、例で示したように実際には null がないことを前提としています。

于 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 は false を意味し、それ以外は true

于 2013-07-09T14:42:06.170 に答える