T-SQL-按时间顺序查找记录

香茅

这是我在此的头一篇博文。尽管我已经使用了几年了,但我仍然是SQL的新手。我正在尝试找到以下问题的解决方案,并正在寻找一些建议,请尽可能简单。

我有这个“ recordTable”,其中包含与交易相关的以下各列;“ personID”,“ recordID”,“ item”,“ txDate”和“ daySupply”。recordID是主键。几乎每个personID都应具有许多不同的recordID和不同的txDate。

我的注意力集中在2017年全年的一个特定“项目”上。预计对于recordID,一旦商品daySupply过去了,我们将在此之前的5天到之后的5天之间看到该人的txDate较新的recordID。一天结束时供应。

我要揭示的是在这十天的窗口中没有预期的新recordID的不同recordID的数量。我认为这可能很容易解决,但是尝试创建查询存在很多困难,更不用说向某人解释了。

到目前为止,我的想法是创建两个临时表。第一个临时表存储了与所需项目相关的所有记录,而我只是存储了personID,recordID和txDate列。第二个临时表具有personID,recordID以及从txDate和daySupply派生的两个列;这些将代表前五天和后五天。

我正在尝试找到一种方法来确定第一个表中的recordID的数量,而第二个表中没有该personID的预期填充。我以为简单的EXCEPT可以做到这一点,但是我不认为有一种绕过递归类型语句来回答这个问题的方法,而且我从未对递归查询感到满意。

我搜索了Stackoverflow和其他地方,但无法给出答案。我非常感谢一些更聪明的数据人员的帮助。这是到目前为止的代码。谢谢大家!

CREATE TABLE #temp1 (personID VARCHAR(20), recordID VARCHAR(10), txDate 
   DATE)
CREATE TABLE #temp2 (personID VARCHAR(20), recordID VARCHAR(10), startDate 
   DATE, endDate DATE)

INSERT INTO #temp1
SELECT [personID], [recordID], txDate
FROM recordTable
WHERE item = 'desiredItem'
AND txDate > '12/31/16'
AND txDate < '1/1/18';

INSERT INTO #temp2
SELECT [personID], [recordID], (txDate + (daySupply - 5)), (txDate + 
  (daySupply + 5))
FROM recordTable
WHERE item = 'desiredItem'
AND txDate > '12/31/16'
AND txDate < '1/1/18';
匹兹堡DBA

可以这样表示:“给定一组订单,返回一个子集,该子集在预期重新供应日期(定义为txDate + DaysSupply)的+/- 5天内没有订单。

只需使用NOT EXISTS即可解决。定义您要检查的订单范围,此查询将查找在预期重新供应日期(txDate + daysSupply)的任意5天之内没有重新供应订单(NOT EXISTS)的那些订单的子集。

SELECT
    gappedOrder.personID
    , gappedOrder.recordID
    , gappedOrder.item
    , gappedOrder.txDate
    , gappedOrder.daysSupply
FROM
    recordTable as gappedOrder
WHERE
    gappedOrder.item = 'desiredItem'
    AND gappedOrder.txDate > '12/31/16'
    AND gappedOrder.txDate < '1/1/18'
    --order not refilled within date range tolerance
    AND NOT EXISTS
    (
    SELECT
        1
    FROM
        recordTable AS refilledOrder
    WHERE
        refilledOrder.personID = gappedOrder.personID
        AND refilledOrder.item = gappedOrder.item
        --5 days prior to (txDate + daysSupply)
        AND refilledOrder.txtDate >= DATEADD(day, -5, DATEADD(day, gappedOrder.daysSupply, gappedOrder.txDate))
        --5 days after (txtDate + daysSupply)
        AND refilledOrder.txtDate <= DATEADD(day, 5, DATEADD(day, gappedOrder.daysSupply, gappedOrder.txtDate))
    );

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章