1

例: 元のテーブルに次の値が含まれているとします。

AcctNbr StatusDate
------------------
123     01/01/2012    
123     01/01/2013
123     12/11/2011
987     01/01/2009

SQL は、次を含む新しいテーブルを作成します。

AcctNbr EarliestStatusDate LatestStatusDate
-------------------------------------------
123     12/11/2011         01/01/2013
987     01/01/2009         01/01/2009

これを行う効率的な方法を探しています。機能する方法がありますが、容認できないほど長い時間がかかります。誰でも最適化のヒントを持っていますか。どんな助けでも大歓迎です。

SET NOCOUNT ON

DROP TABLE loopTemp
DROP TABLE reportTemp

CREATE TABLE loopTemp
(   ID int IDENTITY(1, 1) NOT NULL, 
    AcctNbr varchar(50),
)

CREATE TABLE reportTemp
(
    AcctNbr varchar(50),
    EarliestStatus Date,
    LatestStatus Date 
)

INSERT INTO loopTemp
SELECT DISTINCT AcctNbr
FROM AutoStatusHistory 

DECLARE @COUNTER AS INT
SET @COUNTER = 1

DECLARE @MAX AS INT
SET @MAX = (SELECT MAX(ID) FROM loopTemp)

WHILE @COUNTER < @MAX BEGIN 
    DECLARE @ACCOUNT_NUMBER AS varchar(50)
    SET @ACCOUNT_NUMBER = 
        (SELECT AcctNbr FROM loopTemp WHERE ID = @COUNTER)

    DECLARE @EARLIESTSTATUSDATE AS DATE
    SET @EARLIESTSTATUSDATE =   (SELECT MIN(NewStatusDate)
                                 FROM AutoStatusHistory 
                                 WHERE AcctNbr = @ACCOUNT_NUMBER)

    DECLARE @LATESTSTATUSDATE AS DATE
    SET @LATESTSTATUSDATE =     (SELECT MAX(NewStatusDate)
                                 FROM AutoStatusHistory 
                                 WHERE AcctNbr = @ACCOUNT_NUMBER)

    INSERT INTO reportTemp
    VALUES (@ACCOUNT_NUMBER, @EARLIESTSTATUSDATE, @LATESTSTATUSDATE)

    IF (@COUNTER % 1000) = 0 BEGIN
        PRINT @COUNTER 
    END -- IF

    SET @COUNTER = @COUNTER + 1
END -- WHILE 

DROP TABLE loopTemp
4

3 に答える 3

2

何かが欠けていない限り、これは非常に簡単なはずです。

SELECT AcctNbr, MIN(StatusDate) AS EarliestStatusDate, 
    MAX(StatusDate) AS LatestStatusDate
FROM myTable
GROUP BY AcctNbr
于 2013-03-21T14:03:54.420 に答える
0

使用できます

SELECT *
INTO TableName
FROM (
SELECT AcctNbr, MIN([Status Date]) AS EarliestStatusDate, 
    MAX([Status Date]) AS LatestStatusDate
FROM myTable
GROUP BY AcctNbr
) RequiredData
于 2013-03-21T14:09:48.193 に答える
0

SQL Server を使用しているようです。このために、次のことができます。

select AcctNbr, min(StatusDate) as EarliestStatusDate,
       max(StatusDate) as LatestStatusDate
into ReportTemp
from AutoStatusHistory
group by AcctNbr

このintoステートメントは、結果をテーブルに保存します。次の構文を使用して、実際の一時テーブルを使用することもできます。

into #ReportTemp
于 2013-03-21T14:06:14.043 に答える