Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/80.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL:如果存在,则最晚日期之后的最早日期为Null_Sql_Date - Fatal编程技术网

SQL:如果存在,则最晚日期之后的最早日期为Null

SQL:如果存在,则最晚日期之后的最早日期为Null,sql,date,Sql,Date,使用T-Sql,我希望返回最新空值之后的最小日期(如果存在),并在没有空值的任何产品上简单地返回最小日期。 表: 任何解决方案都将不胜感激。谢谢。一种方法是计算给定值的给定行之前出现的空值数。这将范围划分为多个组。对于每组,取最小日期。并且,找到每种产品的最大最短日期: select product, minDate from (select product, NumNulls, min(DateSold) as minDate, row_number() over (

使用T-Sql,我希望返回最新空值之后的最小日期(如果存在),并在没有空值的任何产品上简单地返回最小日期。 表:


任何解决方案都将不胜感激。谢谢。

一种方法是计算给定值的给定行之前出现的空值数。这将范围划分为多个组。对于每组,取最小日期。并且,找到每种产品的最大最短日期:

select product, minDate
from (select product, NumNulls, min(DateSold) as minDate,
             row_number() over (partition by product order by min(DateSold) desc
                               ) as seqnum
      from (select t.*,
                   (select count(*)
                    from table t2
                    where t2.product is null and t2.DateSold <= t.DateSold
                   ) as NumNulls
            from table t
           ) t
      group by Product, NumNUlls
     ) t
where seqnum = 1;

在您的数据中,一个范围内没有不同产品的混合,因此此查询也假定这是正确的。

如果涉及到一个组,则我可以这样做,否则您如何知道空值是在a或B产品的运行中?我意识到这可能不是你想要的,但我希望它能有所帮助

WITH DATA_IN AS (
SELECT 1 as grp,
       convert(DateTime,'12/31/2012') as d_Date,
      'A' AS d_ch
  UNION ALL
SELECT 1, '1/31/2013',   NULL UNION ALL
SELECT 1, '2/28/2013',    'A' UNION ALL
SELECT 1, '3/31/2013',    'A' UNION ALL
SELECT 1, '4/30/2013',    'A' UNION ALL
SELECT 1, '5/31/2013',   NULL UNION ALL
SELECT 1, '6/30/2013',    'A' UNION ALL
SELECT 1, '7/31/2013',    'A' UNION ALL
SELECT 1, '8/31/2013',    'A' UNION ALL
SELECT 1, '9/30/2013',    'A' UNION ALL

SELECT 2, '12/31/2012',   'B' UNION ALL
SELECT 2, '1/31/2013',    'B' UNION ALL
SELECT 2, '2/28/2013',    'B' UNION ALL
SELECT 2, '3/31/2013',    'B' UNION ALL
SELECT 2, '4/30/2013',    'B' UNION ALL
SELECT 2, '5/31/2013',    'B' UNION ALL
SELECT 2, '6/30/2013',    'B' UNION ALL
SELECT 2, '7/31/2013',    'B' UNION ALL
SELECT 2, '8/31/2013',    'B' UNION ALL
SELECT 2, '9/30/2013',    'B'
)
SELECT
  grp as YourGroup,
  (SELECT Min(d_date) -- first date after...
   FROM DATA_IN
   WHERE d_date>
    Coalesce( -- either the latest NULL
     (SELECT max(d_Date)
      FROM DATA_IN d2
      WHERE d2.grp=d1.grp AND d2.d_ch IS NULL
     )
     , '1/1/1901'  -- or a base date if no NULLs
    )
  ) as MinDateSold
FROM DATA_IN d1
GROUP BY grp
结果:

1   2013-06-30 00:00:00.000
2   2012-12-31 00:00:00.000

最后定义。sqlThis中没有订单收集了正确的日期,但我不确定这是否可行,因为我的实际表将有约500k条记录,其中包含约100k个产品。谢谢你抽出时间。
WITH DATA_IN AS (
SELECT 1 as grp,
       convert(DateTime,'12/31/2012') as d_Date,
      'A' AS d_ch
  UNION ALL
SELECT 1, '1/31/2013',   NULL UNION ALL
SELECT 1, '2/28/2013',    'A' UNION ALL
SELECT 1, '3/31/2013',    'A' UNION ALL
SELECT 1, '4/30/2013',    'A' UNION ALL
SELECT 1, '5/31/2013',   NULL UNION ALL
SELECT 1, '6/30/2013',    'A' UNION ALL
SELECT 1, '7/31/2013',    'A' UNION ALL
SELECT 1, '8/31/2013',    'A' UNION ALL
SELECT 1, '9/30/2013',    'A' UNION ALL

SELECT 2, '12/31/2012',   'B' UNION ALL
SELECT 2, '1/31/2013',    'B' UNION ALL
SELECT 2, '2/28/2013',    'B' UNION ALL
SELECT 2, '3/31/2013',    'B' UNION ALL
SELECT 2, '4/30/2013',    'B' UNION ALL
SELECT 2, '5/31/2013',    'B' UNION ALL
SELECT 2, '6/30/2013',    'B' UNION ALL
SELECT 2, '7/31/2013',    'B' UNION ALL
SELECT 2, '8/31/2013',    'B' UNION ALL
SELECT 2, '9/30/2013',    'B'
)
SELECT
  grp as YourGroup,
  (SELECT Min(d_date) -- first date after...
   FROM DATA_IN
   WHERE d_date>
    Coalesce( -- either the latest NULL
     (SELECT max(d_Date)
      FROM DATA_IN d2
      WHERE d2.grp=d1.grp AND d2.d_ch IS NULL
     )
     , '1/1/1901'  -- or a base date if no NULLs
    )
  ) as MinDateSold
FROM DATA_IN d1
GROUP BY grp
1   2013-06-30 00:00:00.000
2   2012-12-31 00:00:00.000