2

私を助けるために時間を割いてくれてありがとう!私はSQLを知っている人なら誰でも簡単にできると思うことをSQLに実行させようとしていますが、この時点で頭を悩ませています。

私はこのような小さなテーブルを持っています-

Update   Order    UpdateDate                OrderDate
9297    3590    2012-12-06                    2012-12-06 
9298    3590    2012-12-06                    2012-12-06 
9356    3590    2012-12-07                    2012-12-06 
9369    3590    2012-12-08                    2012-12-06 
9381    3590    2012-12-10                    2012-12-06 

私の目標は、過去3日間に更新されていない注文を見つけることです。

私がやろうとしていることの醜いバージョンはこのようなものです-

Select order from orderstable
where cast(max(updatedate)-getdate() as int) >3

ここでの目標は、過去3日間に更新されていない「注文」をコマンドが返すようにすることです。私の現在の問題は、注文の「最新の」更新だけにSQLを集中させる方法がわからないことです。

4

5 に答える 5

2

最も簡単な方法は、日付を比較することです。

select *
from orderstable ot
where datediff(day, updatedate, getdate()) > 3

ご覧のとおり、注文ごとに複数のレコードがあり、過去3日間に更新がない注文が必要です。私はこれを集計で行います:

select order
from orderstable ot
group by order
having min(datediff(day, updatedate, getdate())) > 3

過去3日間に更新がない注文を探すことによってもそれを行うことができます。

select distinct order
from orderstable
where order not in (select order
                    from orderstable
                    where datediff(day, updatedate, getdate()) <= 3)
于 2012-12-11T01:31:11.010 に答える
1

まず、DATEDIFFは引数にできないため、使用を避けます。http ://weblogs.sqlteam.com/dang/archive/2009/03/07/Low-Hanging-Fruit-of-Sargable-Expressions.aspx

    ;WITH MaxOrders AS (
        SELECT Order, MAX(UpdateDate) MaxUpdateDate
        FROM orderstable
        GROUP BY Order

    )

    SELECT Order 
    FROM MaxOrders
    WHERE MaxUpdateDate < DATEADD(day,-3,GETDATE());

この例では、関数に静的な値GETDATE()があるため、DATEADDは引数可能です。関数に列の値が含まれている場合、引数は設定できません。つまり、これに変更する場合は次のようになります。

WHERE DATEADD(day,3,MaxUpdateDate) < GETDATE();

基準の一致が決定される前に、関数ですべての列の値を評価する必要があるため、引数を指定できなくなります。これは、where句でDATEDIFFを使用する場合の問題です。関数に列の値があります。これは、ビッグデータセットでは非常に高額になります。

于 2012-12-11T01:57:04.953 に答える
0

getdate()を使用して現在の日付を取得してみませんか?

だからこのようなもの:

SELECT order FROM orderstable
WHERE datediff(day, updatedate, getdate()) > 3

(はい、これはタイトルで尋ねられた質問には答えませんが、質問の本文で提起された問題には答えます)

タイトルで尋ねられた質問に答えるには、どうですか?

SELECT order FROM orderstable
WHERE datediff(day, orderdate, (select max(updatedate) from orderstable)) > 3
于 2012-12-11T01:30:57.120 に答える
0
DECLARE @T TABLE(
[Update] INT,
[Order] INT,
UpdateDate DATE,
OrderDate DATE
)

INSERT INTO @T VALUES
(9297,3590,'2012-12-06','2012-12-06'),
(9298,3590,'2012-12-06','2012-12-06'),
(9356,3590,'2012-12-07','2012-12-06'),
(9369,3590,'2012-12-08','2012-12-06'), 
(9381,3590,'2012-12-10','2012-12-06'),
(9382,3591,'2012-12-07','2012-12-06'),
(9383,3591,'2012-12-08','2012-12-06'),
(9384,3592,'2012-12-07','2012-12-06'),
(9385,3592,'2012-12-09','2012-12-06'),
(9386,3593,'2012-12-05','2012-12-06'),
(9387,3593,'2012-12-07','2012-12-06')    


--Assuming we don't care about time, cast to DATE to remove time values from GETDATE() function.
--It also assumes that today is inclusive.
;WITH RECENT_UPDATES_CTE
AS (
    SELECT [Order],MAX([UpdateDate]) [LastUpdateDate] FROM @T
    GROUP BY [Order]
)
SELECT DISTINCT T.[Order] FROM @T T
LEFT JOIN RECENT_UPDATES_CTE C ON C.[Order] = T.[Order]
WHERE C.LastUpdateDate <= DATEADD(DAY,-3,CAST(GETDATE() AS DATE))
于 2012-12-11T05:23:24.983 に答える
0

MAX(UpdateDate)を見つけるためにOVER句を使用します

;WITH cte AS
 (       
  SELECT *,
         DATEDIFF(d, MAX(UpdateDate) OVER (PARTITION BY [Order]), GETDATE()) AS diff_date
  FROM orderstable
  )
  SELECT [Update], [Order], UpdateDate, OrderDate
  FROM cte
  WHERE diff_date > 3

SQLFiddleのデモ

于 2012-12-11T08:08:40.830 に答える