T-SQL从Max(日期)中提取图像

时间:2016-07-15 18:44:22

标签: sql-server tsql max greatest-n-per-group

我在数据库中有图片,我现在需要提取。图像列的类型为varbinary(max)

我尝试使用JOIN或子查询的几个例子无济于事。如果不是图像,开发的查询将起作用。使用DISTINCTMAX(date)仍然无法消除旧图像。许多ID都有多张图片。使用Max(Date)将提取最近的日期,但添加图片会消除所有过滤。

查询如下所示:

SELECT DISTINCT ID, Image, DateModified, GETDate()
 FROM images
WHERE 
   TYPE = 'B'

ID  Image  DateMod     Type

1   0x789  01-02-2014  B

1   0x791  11-12-2015  B   <-- this is a tgt record

2   0x675  12-01-2015  A

5   0x324  06-26-2015  B   <-- this is a tgt record

如果我使用MAX(DateModified),会强制GROUP BY并且仍然无法消除旧图像。我需要每个ID的最新Type'B'图像。我正在研究SQL Server 2012.

我需要输出的是什么 image, ID, DateModified, TodaysDate (GetDate)

3 个答案:

答案 0 :(得分:4)

很确定你想要这样的东西。

with SortedResults as
(
    select ID
        , Image
        , DateMod
        , Type
        , ROW_NUMBER() over (partition by ID order by DateMod desc) as RowNum
    from images
    where Type = 'B'
)


select ID
    , Image
    , DateMod
    , GetDate()
from SortedResults
where RowNum = 1

答案 1 :(得分:2)

尝试以下查询

SELECT
  I.[Image],
  I.DateMod,
  GetDate()
FROM
(
    SELECT  
        ID,
        MAX(DateModified) AS DateModified   
    FROM 
        images 
    WHERE 
        [TYPE] = 'B'
    GROUP BY
        ID
) A INNER JOIN 
images I ON A.ID = I.ID AND A.DateModified = I.DateModified

答案 2 :(得分:0)

问题可能是双重的:

  • 1)您混淆了SQL Server中使用的子句的逻辑顺序。
  • 2)你的DISTINCT是罪魁祸首。

我建议您学习并记住Logical order of SQL Clauses,以便逻辑理解SQL Server如何阅读您的规定查询。为简单起见,请从经典列表开始,该列表在很多地方使用。

Classic         Complete

FROM        |   FROM
WHERE       |   ON
GROUP BY    |   JOIN
HAVING      |   WHERE
SELECT      |   GROUP BY
ORDER BY    |   WITH CUBE, WITH ROLLUP
            |   HAVING
            |   SELECT
            |   DISTINCT
            |   ORDER BY
            |   TOP

我们已经可以看到您的查询返回结果错误的原因,因为SQL Server 将列集粉碎在一起,而是在列中粉碎不同的。< / p>

您的示例列表:

ID  Image  DateMod     Type

1   0x789  01-02-2014  B    
1   0x791  11-12-2015  B   <-- this is a tgt record   
2   0x675  12-01-2015  A    
5   0x324  06-26-2015  B   <-- this is a tgt record

具有唯一的,因此会返回所有记录。显然,问题是DISTINCT

一种解决方案是保持谓词相同,并使用GROUP BY子句粉碎列集,并使用MAX()聚合函数返回最大值。

;WITH C AS
( SELECT ID
        , MAX(DateMod) AS DateModified
        , CONVERT(VARCHAR(10), GETDATE(), 110) AS [Current_Time]
FROM   #Images
WHERE Type = 'B'
GROUP BY ID, Type)

SELECT C.ID, B.Image, C.DateModified, C.[Current_Time]
FROM C
LEFT OUTER JOIN (SELECT ID, DateMod, Image FROM #Images) B ON C.ID = B.ID
                                                        AND C.DateModified = B.DateMod

- 结果

ID  Image           DateModified  Current_Time
1   0x3078373931    11-12-2015    07-16-2016
5   0x3078333234    06-26-2015    07-16-2016