5

私は次のような調達契約を含むテーブルを持っています:

+------+-----------+------------+---------+------------+-----------+
| type | text      | date       | company | supplierID | name      |
+ -----+-----------+------------+---------+------------+-----------+
| 0    | None      | 2004-03-29 | 310     | 227234     | HRC INFRA |
| 0    | None      | 2007-09-30 | 310     | 227234     | HRC INFRA |
| 0    | None      | 2010-11-29 | 310     | 227234     | HRC INFRA |
| 2    | Strategic | 2011-01-01 | 310     | 227234     | HRC INFRA |
| 0    | None      | 2012-04-10 | 310     | 227234     | HRC INFRA |
+------+-----------+------------+---------+------------+-----------+

この例では、最初の3行のコントラクトは同じです。だから私は最初のものだけが欲しいです。タイプ=2の行は、特定のサプライヤとの調達契約の変更です。その行も選択したいと思います。最後の行でコントラクトが0に戻るので、その行も選択します。

基本的に、最初の行と契約タイプが変更される行を選択します。したがって、結果は次のようになります。

+------+-----------+------------+---------+------------+-----------+
| type | text      | date       | company | supplierID | name      |
+ -----+-----------+------------+---------+------------+-----------+
| 0    | None      | 2004-03-29 | 310     | 227234     | HRC INFRA |
| 2    | Strategic | 2011-01-01 | 310     | 227234     | HRC INFRA |
| 0    | None      | 2012-04-10 | 310     | 227234     | HRC INFRA |
+------+-----------+------------+---------+------------+-----------+

これを達成する方法について何か提案はありますか?

4

3 に答える 3

1

あなたが望むものかもしれません。おそらくあなたはタイプ<0を持っていません。

SELECT * 
FROM [TABLE] as ot where ot.type <> 
(select top 1 coalesce(it.type, -1) from [TABLE] as it where it.date < ot.date order by it.date desc)

また、PKが表示されないため、shureテーブルを注文するためにブランドンノートに注意しないでください。

于 2012-12-20T12:01:16.510 に答える
1

テストするSQLサーバーが目の前にないので、今は実際のソリューションを試すつもりはありませんが、必要なものはいくつかあります。

1)レコードが正しく順序付けられていることを確認する方法。ここにはIDが表示されていません。つまり、この順序で表示される保証はありません。あると思いますので、必ず注文してください

2)インデックスが何であれ、テーブル自体に対して外部結合を行う必要がありますが、「table1.index = table2.index」の代わりに、「table1.index = table2.index+1」のようになります。インデックスがシーケンシャルでない場合は、この方法でインデックスを結合することは、それよりも複雑になります。

3)where句では、次のように指定します

where table1.type <> table2.type

それはあなたをそこへの道へと導くでしょう。ただし、比較する最初のレコードの前にレコードがないため、最初のレコードは取得されません。そのため、これを補うためにORを追加する必要があります。そして、私はタイプにNULL値がないと仮定しています。

申し訳ありませんが、実際の実装についてはこれ以上お役に立てませんでしたが、まもなく他の誰かが対応してくれるかもしれません。

于 2012-12-20T11:55:01.467 に答える
1
;WITH cte AS
 (
  SELECT ROW_NUMBER() OVER (ORDER BY date) AS Id,
         type, text, date, company, supplierId, name
  FROM your_table
  )
  SELECT c1.type, c1.text, c1.date, c1.company,
         c1.supplierId, c1.name
  FROM cte c1 LEFT JOIN cte c2 ON c1.id = c2.id + 1
  WHERE c2.text IS NULL OR c1.text != c2.text

SQLFiddleのデモ

于 2012-12-20T16:21:03.337 に答える