2

次の形式のデータがあります。

DATE                 DATA1                 DATA2
-------------------------------------------------
20121010             ABC                   DEF
20121010             DEF                   ABC
20121010             HIJ                   KLM
20121010             KLM                   HIJ
20121212             ABC                   DEF
20121212             DEF                   ABC
20121212             HIJ                   KLM
20121212             KLM                   HIJ

私がやりたいのは、行 1 と 3 を選択することです。行 2 と 4 は、私の目には本質的に「重複」しているため、気にしません。

簡単に思えますが、これを達成するためにクエリをまとめようとしています。

4

5 に答える 5

1
SELECT Date,  Data1, Data2
FROM tableX
WHERE Data1 <= Data2

UNION 

SELECT Date,  Data2, Data1
FROM tableX
WHERE Data2 < Data1 ;
于 2013-01-05T22:28:44.390 に答える
1

row_number()バージョン 2005 以降を使用していると仮定すると、この関数を使用できます。

select date, data1, data2
from (select t.*,
             row_number() over (partition by date order by date) as seqnum
      from t
     ) t
where seqnum = 1

order by dateは、 をサポートするすべてのデータベースで任意の順序を生成する必要がありますrow_number。SQL Server では、 も使用できますorder by (select NULL)

または、あなたの質問は、順序に関係なく、重複を排除することに関するものかもしれません. そのために、次のことができます。

select distinct date, minData, maxData
from (select t.date,
             (case when data1 > data2 then data1 else data2 end) as minData,
             (case when data1 > data2 then data2 else data1 end) as maxData
      from t
     ) t

ただし、1 行しか表示されない場合は、2 つの値が再配置される可能性があります。

列の元の順序を維持し、追加の行を削除するより複雑なソリューションは、2 つのアプローチを組み合わせたものです。

select date, data1, data2
from (select t.*,
             row_number() over (partition by date order by minData, maxData) as seqnum
      from (select t.*
                   (case when data1 > data2 then data1 else data2 end) as minData,
                   (case when data1 > data2 then data2 else data1 end) as maxData
            from t
           ) t
     ) t
where seqnum = 1
于 2013-01-05T16:48:38.023 に答える
0

私はこのようにそれが好きです:しかし、あなたがプレを使用しているならそれはうまくいかないと思いますSQL-Server 2008R2

;WITH myCTE
        AS
        (
        SELECT 
            [Rw] = ROW_NUMBER() OVER (ORDER BY [Date]),
            [Date],
            [DATA1],
            [DATA2]
        FROM #data
        )
SELECT *
FROM myCTE x    
WHERE NOT EXISTS
            (
            SELECT 1
            FROM myCTE y
            WHERE
                x.DATA1 = y.DATA2 AND
                x.Rw > y.Rw AND
                x.Date = y.Date
            )

これがSQLFiddleのライブイラストです

于 2013-01-05T17:11:20.220 に答える
0
 ;WITH cte AS
 (
  SELECT DATE, DATA1, DATA2, ROW_NUMBER() OVER(ORDER BY DATE, DATA1) AS Id
  FROM dbo.test70 t
  )
  SELECT c.DATE, c.DATA1, c.DATA2
  FROM cte c LEFT JOIN cte ct ON c.Id = ct.Id + 1 AND c.DATA1 = ct.DATA2 
  WHERE ct.DATE IS NULL

SQLFiddleのデモ

于 2013-01-05T22:12:26.023 に答える
0

これを試すことができます:

SQLデモはこちら

;WITH CTE AS
(
  SELECT date, data1, data2, 
  CASE WHEN DATA2 > DATA1 THEN data1 + data2 
  ELSE data2 + data1 END d
  FROM T
),CTE2 AS 
(
  SELECT *,
  ROW_NUMBER() OVER (PARTITION BY DATE, d 
                     ORDER BY data1) rn
  FROM CTE
)
SELECT date, data1, data2 FROM CTE2 WHERE rn = 1
于 2013-01-05T17:30:18.247 に答える