0
     DateTime        --  Unit  --  Client  --- Qty
03/02/2013 08:00:01  --   3     --   1      ---   1
03/02/2013 08:00:02  --   3     --   2      ---   1
03/02/2013 08:00:03  --   3     --   3      ---   2
03/02/2013 08:00:04  --   3     --   3      ---   2
03/02/2013 08:00:05  --   3     --   3      ---   5
03/02/2013 08:00:06  --   3     --   3      ---   4
03/02/2013 08:00:07  --   3     --   4      ---   6
03/02/2013 08:00:08  --   3     --   4      ---   67
03/02/2013 08:00:09  --   3     --   4      ---   76
03/02/2013 08:00:10  --   3     --   4      ---   76

そして私は欲しい:

     DateTime        --  Unit  --  Client  --- Qty
03/02/2013 08:00:01  --   3     --   1      ---   1
03/02/2013 08:00:02  --   3     --   2      ---   1
03/02/2013 08:00:03  --   3     --   3      ---   2
03/02/2013 08:00:05  --   3     --   3      ---   5
03/02/2013 08:00:07  --   3     --   4      ---   6
03/02/2013 08:00:09  --   3     --   4      ---   76

フィルタリングする基準は、テーブルから最小および最大の「数量」を取得し、同じ「単位」および「クライアント」列に重複する「数量」値が存在する場合は最初の値のみを取得することです。

次のT-SQLを実行しますが、「Unit」列と「client」列が同じ場合、取得は最後の「Qty」値です。最初の値が必要です。

    --1
CREATE TABLE Transact
    (DateTime   DateTime,
     Unit       INT NULL,
     Client     INT NULL,
     Qty        INT NULL
    )

INSERT INTO Transact (Datetime,Unit,Client,Qty)
    Values ( '03/02/2013 08:00:01',3,1,1)
    Values ( '03/02/2013 08:00:02',3,2,1)
    Values ( '03/02/2013 08:00:03',3,3,2)
    Values ( '03/02/2013 08:00:04',3,3,2)
    Values ( '03/02/2013 08:00:05',3,3,5)
    Values ( '03/02/2013 08:00:06',3,3,4)
    Values ( '03/02/2013 08:00:07',3,4,6)
    Values ( '03/02/2013 08:00:08',3,4,67)
    Values ( '03/02/2013 08:00:09',3,4,76)
    Values ( '03/02/2013 08:00:10',3,4,76)


DECLARE @Total TABLE
    (DateTime   DateTime,
     Unit       INT NULL,
     Client     INT NULL,
     Qty        INT NULL
    )
DECLARE @Uniques TABLE
    (DateTime   DateTime,
     Unit       INT NULL,
     Client     INT NULL,
     Qty        INT NULL
    )
DECLARE @Mini TABLE
    (DateTime   DateTime,
     Unit       INT NULL,
     Client     INT NULL,
     Qty        INT NULL
    )
DECLARE @Maxi TABLE
    (DateTime   DateTime,
     Unit       INT NULL,
     Client     INT NULL,
     Qty        INT NULL
    )
--2

INSERT INTO @Total SELECT * FROM Transact

INSERT INTO @Mini SELECT  MIN(Datetime) Datetime,Unit,Client,MIN(Qty) FROM @Total GROUP BY Unit,Client 
INSERT INTO @Maxi SELECT  MAX(Datetime) Datetime,Unit,Client,MAX(Qty) FROM @Total GROUP BY Unit,Client

--3

INSERT INTO @Uniques SELECT * FROM @Mini UNION SELECT * FROM @Maxi

SELECT * FROM @Uniques

前もって感謝します。

パブロ・ジェロニモ。

4

3 に答える 3

3

これを試して:

WITH MinCTE
AS
(
  SELECT *,
    ROW_NUMBER() OVER(Unit, PARTITION BY Client
                      ORDER BY Qty, DateTime ) AS RN
  FROM Transact
), MaxCTE
AS
(
  SELECT *,
    ROW_NUMBER() OVER(PARTITION BY Unit, Client
                      ORDER BY Qty DESC, DateTime) AS RN
  FROM Transact
)
SELECT DateTime, Unit, Client, Qty FROM MinCTE WhERE RN = 1
UNION  
SELECT DateTime, Unit, Client, Qty FROM MaxCTE WhERE RN = 1;
于 2013-03-17T02:21:03.323 に答える
1

あなたが試すことができるものは次のとおりです:

SELECT DISTINCT MIN(DateTime), MIN(Qty), Unit, Client FROM Transact
GROUP BY Unit, Client
UNION
SELECT DISTINCT MAX(DateTime), MAX(Qty), Unit, Client FROM Transact
GROUP BY Unit, Client
于 2013-03-17T06:17:08.170 に答える
0

最初に最小数量と最大数量のレコードを 1 つのテーブルに選択し、次にそれらのレコードの最小 DateTime を選択します。

SELECT MIN(DateTime), [Transact].Unit, [Transact].Client, [Transact].Qty 
FROM (
    SELECT DISTINCT Unit, Client, MIN(Qty) as Qty
    FROM [Transact]
    GROUP BY Unit, Client
    UNION
    SELECT Unit, Client, MAX(Qty)
    FROM [Transact]
    GROUP BY Unit, Client
    ) as MinMax
JOIN [Transact] ON [Transact].Unit = MinMax.Unit AND [Transact].Client = MinMax.Client AND [Transact].Qty = MinMax.Qty
GROUP BY [Transact].Unit, [Transact].Client, [Transact].Qty

サブクエリを使用しましたが、必要に応じてメモリ テーブルに変更することは難しくありません。

于 2013-03-17T02:40:50.543 に答える