【问题标题】:Finding max(date) from the resultant query output从结果查询输出中查找 max(date)
【发布时间】:2014-12-31 05:52:24
【问题描述】:

我有以下 2 张桌子:

table1

objName | rptName | srcTblName | srcFileName | srcDateColName
--------------------------------------------------------------
obj1    | rpt1    | srcTbl1    | srcFile1.csv| srcDate

table2

FileName     | FileSize
------------------------
srcFile1.csv | 2009

以下查询为我提供了不同的表和日期列名称。

SELECT DISTINCT a.srcTblName, a.SrcDateColName
FROM table1 a
LEFT JOIN table2 b
ON a.srcFileName LIKE b.FileName
WHERE a.srcTblName is NOT NULL
AND a.srcFileName is NOT NULL

输出

srcTblName               |  srcDateColName
---------------------------------------------
tableN                   |    EntryDate
tableO                   |    Modified_Date

输出的第二列是SrcTblName中的COLUMN_NAME,即日期。

我想在同一查询中从相应的 srcTblName 中找到 ma​​x(srcDateColName)。 谁能帮我修改上面的查询?

【问题讨论】:

  • 不清楚,发布一些示例数据。或使用sqlfiddle
  • 您可以使用光标来完成您的工作,如果您愿意,我可以为您提供查询

标签: sql sql-server-2008 join sqldatetime


【解决方案1】:

由于你必须从一个表中执行tablename和datecolumn,你必须使用动态sql

SELECT * INTO tableN FROM
(
SELECT '01/JAN/2014' EntryDate
UNION ALL
SELECT '24/JAN/2014'
UNION ALL
SELECT '13/MAR/2014'
)TAB


SELECT * INTO tableO FROM
(
SELECT '11/APR/2014' Modified_Date
UNION ALL
SELECT '18/MAY/2014'
UNION ALL
SELECT '22/JUN/2014'
)TAB

SELECT * INTO NEWTBL FROM
(
  SELECT 'tableN' srcTblName,'EntryDate' srcDateColName
  UNION ALL
  SELECT 'tableO' ,'Modified_Date' 
)TAB

创建一个临时表来获取你的结果

CREATE TABLE #TEMP(srcTblName VARCHAR(100),srcDateColName VARCHAR(100),NEWDATE DATE)

现在使用游标并动态执行它

DECLARE @TABLENAME VARCHAR(100)
DECLARE @COLUMNNAME VARCHAR(100)

-- Here you declare which all columns you need to loop in Cursor
DECLARE CUR CURSOR FOR 

-- Use your SELECT here instead of SELECT srcTblName , srcDateColName FROM NEWTBL

--SELECT DISTINCT a.srcTblName, a.SrcDateColName
--FROM table1 a
--LEFT JOIN table2 b
--ON a.srcFileName LIKE b.FileName
--WHERE a.srcTblName is NOT NULL
--AND a.srcFileName is NOT NULL

SELECT srcTblName , srcDateColName
FROM NEWTBL


OPEN CUR

-- Select each tablename and datecolumn and execute dynamically 
FETCH NEXT FROM CUR 
INTO @TABLENAME,@COLUMNNAME

WHILE @@FETCH_STATUS = 0
BEGIN

    DECLARE @QRY NVARCHAR(MAX) 

    SET @QRY = '
            INSERT INTO #TEMP
            SELECT '''+@TABLENAME+''' , '''+@COLUMNNAME+''',
            (SELECT MAX(CAST('+@COLUMNNAME+' AS DATE))ENDT FROM '+@TABLENAME+')AA                              
            '

    EXEC SP_EXECUTESQL @QRY

    -- Fetches next record and increments the loop
    FETCH NEXT FROM CUR 
    INTO @TABLENAME,@COLUMNNAME
END 

CLOSE CUR;
DEALLOCATE CUR;

【讨论】:

  • 你得到结果了吗? @Touhid K.
  • 我是用 TEMP 表做的。请检查我给出的答案。 :) 感谢您的帮助。 :)
【解决方案2】:

使用以下查询,希望对您有所帮助。

SELECT  a.srcTblName, max(a.SrcDateColName)
FROM table1 a
LEFT JOIN table2 b
ON a.srcFileName LIKE b.FileName
WHERE a.srcTblName is NOT NULL
AND a.srcFileName is NOT NULL
group by a.srcTblName

【讨论】:

  • 我认为您的问题没有正确。 srcTblName 是数据库中不同表的名称。 srcDateColName 是该表中的列名。我想从这个表中找到最大值(日期)。
  • 在这种情况下,您无法在一个查询中完成。试着写一个函数。
【解决方案3】:

你可以做什么

declare @name varchar(50),
        @column varchar(50),
        @query varchar(max)

declare @table table(TableName varchar(50),
                     MaxDate datetime)

declare c cursor for
-- your query here
SELECT DISTINCT a.srcTblName, a.SrcDateColName
FROM t1 a
LEFT JOIN t2 b
ON a.srcFileName LIKE b.FileName
WHERE a.srcTblName is NOT NULL
AND a.srcFileName is NOT NULL

open c
fetch next from c into @name,@column
while @@fetch_status=0
begin
  -- executing the code for each table mentioned in your srcTblName
  set @query='select ''' + @name + ''' as TableName,max(' + @column + ') as Date from ' + @name
  --print @query
  insert into @table(TableName,MaxDate)
  exec(@query)
  fetch next from c into @name,@column
end
close c
deallocate c

select * from @table

这里有一个工作的DEMO

希望对你有帮助

【讨论】:

    【解决方案4】:

    Hadi 和 Sarath 给出的答案似乎有效,但光标似乎影响了性能。所以我使用 TEMP Table 如下所示:

    DECLARE @OBJECT_NAME VARCHAR(50) = 'ObjName'      
    
    BEGIN
    DECLARE @Query NVARCHAR(1000),@COUNT INT, @MAX_Count INT, @rptName VARCHAR(255)
    DECLARE @tblName varchar(100),@dateColName varchar(100), @max_Date Date,@fileName varchar(100),@refID INT
    
    DECLARE @Temp_Table TABLE([RowNumber] INT,rptName VARCHAR(500),SrcTblName VARCHAR(500), DateColName VARCHAR(100), SrcFileName VARCHAR(600), RefID INT)
    INSERT INTO @Temp_Table
    SELECT
        ROW_NUMBER()OVER(ORDER BY rptName)
        ,rptName
        ,srcTblName
        ,srcDateColName
        ,srcFileName
        ,ID
    FROM
        table1
    WHERE
        objName  = @OBJECT_NAME
    
    SELECT @MAX_Count = MAX(RowNumber) FROM @Temp_Table
    SET @COUNT = 1
    WHILE (@COUNT <= @MAX_Count)
    BEGIN                   
        SELECT   
            @rptName = rptName,
            @tblName = SrcTblName,
            @fileName = SrcFileName,
            @dateColName = DateColName,
            @refID = RefID    
        FROM   
            @Temp_Table   
        WHERE   
            RowNumber = @COUNT 
    
        IF @tblName IS NOT NULL AND @fileName IS NOT NULL AND @dateColName IS NOT NULL
        BEGIN
            SET @Query = 'SELECT @max_Date = MAX(CONVERT(DATE, ' + @dateColName + ')) FROM ' + @tblName
                EXEC SP_EXECUTESQL @Query, N'@max_Date DATE OUTPUT', @max_DATE OUTPUT
    
        END
    SET @COUNT = @COUNT + 1
    END
    
    END
    

    我希望这将有助于寻找类似解决方案的人。 不过感谢您的帮助:)

    【讨论】:

    • 即使您没有使用过 CURSOR,您的查询工作也一样,在每个循环中您都在获取记录并进行计算。 @Touhid K.
    • 而 CURSOR 和 WHILE 循环的性能取决于情况。您可以阅读各种博客和论坛进行比较。 @Touhid K.
    • @Sarath Avanavu :好的,这对我来说是新的。我会检查的。谢谢。
    猜你喜欢
    • 1970-01-01
    • 2020-11-01
    • 2015-12-10
    • 1970-01-01
    • 1970-01-01
    • 2017-09-09
    • 1970-01-01
    • 1970-01-01
    • 2016-02-17
    相关资源
    最近更新 更多