使用文本和日期时间组合分组

Group by with text and date time combination

我有一个table

id  col1    col2    namecol1    datetime1           teamcol1  namecol2  datetime2
1   12345   2345    name1   2014-10-13 11:57:24.713 teama       
2   12345   2345    name1   2014-10-13 11:57:24.713 teamb     abc       2014-11-29 09:55:38.533
3   12345   2345    name1   2014-10-13 11:57:24.713 teamb     bcd       2014-12-02 06:35:38.917
4   12345   2345    name1   2014-10-13 11:57:24.713 teamc     def       2014-12-22 11:57:54.863
5   12345   2345    name1   2014-10-13 11:57:24.713 teamd     efg       2015-01-03 13:28:24.717

我需要这个输出:

col1    col2    Team1   DateTime1            Team2      DateTime2                   Team3   DateTime3
12345   2345    bcd 2014-12-02 06:35:38.917  def        2014-12-22 11:57:54.863     efg     2015-01-03 13:28:24.717

我试过这个查询:

SELECT 
    MAX(CASE WHEN teamcol1='teamb' THEN namecol2 END) AS Team1, 
    CONVERT(DATE, MAX(CASE WHEN teamcol1='teamb' THEN datetime2 END), 105) AS DateTime1, 
    MAX(CASE WHEN teamcol1='teamc' THEN namecol2 END) AS PRECON_AUDIT, 
    CONVERT(DATE,MAX(CASE WHEN teamcol1='teamc' THEN datetime2 END), 105) AS DateTime2, 
    MAX(CASE WHEN teamcol1 IN ('teamd') THEN namecol2 END) AS Team3, 
    CONVERT(DATE,MAX(CASE WHEN teamcol1 IN ('teamd') THEN datetime2 END),105) AS DateTime3, 
    col1, col2 
FROM 
    (SELECT *  
     FROM table1) Z
WHERE  
    col1 = '12345' 
GROUP BY 
    col1, col2

此查询的输出:

col1    col2    Team1   DateTime1               Team2   DateTime2               Team3   DateTime3
12345   2345    abc     2014-12-02 06:35:38.917  def    2014-12-22 11:57:54.863  efg    2015-01-03 13:28:24.717

我正在使用 SQL Server 2008。

提前致谢。

[编辑] Table1 类似于 audit table,它将包含多个条目,其中包含 col1、col2 的不同组合。 我需要为 col1、col2 不同团队名称的每个组合以及适当的 namecol2 和 datetime2 列显示。 当我使用上面提到的查询时,如果 teamcol1 中没有重复,它会正确地给我输出。如果 teamcol1 中有重复(如问题中所述),它会给我错误的名称 col2。 如果在 teamcol1 中重复,我需要最新的 namecol2 和 datetime2(来自 table 我需要 namecol2 -- bcd 和 datetime2 -- 2014-12-02 06:35:38.917)

首先列出所有组(DISTINCT col1, col2)。

然后为每一组找到最新的一行 datetime2。重复三次,每个 teambteamcteamd.

您可以根据需要的任何逻辑和顺序将复杂查询放入 OUTER APPLY

DECLARE @T TABLE (id int, col1 int, col2 int, namecol1 varchar(255), [datetime1] datetime, teamcol1 varchar(255), namecol2 varchar(255), [datetime2] datetime);

INSERT INTO @T (id, col1, col2, namecol1, datetime1, teamcol1, namecol2, datetime2) VALUES (1, 12345, 2345, 'name1', '2014-10-13 11:57:24.713', 'teama', NULL,   NULL);
INSERT INTO @T (id, col1, col2, namecol1, datetime1, teamcol1, namecol2, datetime2) VALUES (2, 12345, 2345, 'name1', '2014-10-13 11:57:24.713', 'teamb', 'abc', '2014-11-29 09:55:38.533');
INSERT INTO @T (id, col1, col2, namecol1, datetime1, teamcol1, namecol2, datetime2) VALUES (3, 12345, 2345, 'name1', '2014-10-13 11:57:24.713', 'teamb', 'bcd', '2014-12-02 06:35:38.917');
INSERT INTO @T (id, col1, col2, namecol1, datetime1, teamcol1, namecol2, datetime2) VALUES (4, 12345, 2345, 'name1', '2014-10-13 11:57:24.713', 'teamc', 'def', '2014-12-22 11:57:54.863');
INSERT INTO @T (id, col1, col2, namecol1, datetime1, teamcol1, namecol2, datetime2) VALUES (5, 12345, 2345, 'name1', '2014-10-13 11:57:24.713', 'teamd', 'efg', '2015-01-03 13:28:24.717');

WITH
CTE_Groups
AS
(
    SELECT DISTINCT col1, col2
    FROM @T
)
SELECT *
FROM
    CTE_Groups
    OUTER APPLY
    (
        SELECT TOP(1)
            TT.namecol2 AS Team1
            , TT.[datetime2] AS DateTime1
        FROM @T AS TT
        WHERE
            TT.teamcol1 = 'teamb'
            AND TT.col1 = CTE_Groups.col1
            AND TT.col2 = CTE_Groups.col2
        ORDER BY TT.[datetime2] DESC
    ) OA_teamb
    OUTER APPLY
    (
        SELECT TOP(1)
            TT.namecol2 AS Team2
            , TT.[datetime2] AS DateTime2
        FROM @T AS TT
        WHERE
            TT.teamcol1 = 'teamc'
            AND TT.col1 = CTE_Groups.col1
            AND TT.col2 = CTE_Groups.col2
        ORDER BY TT.[datetime2] DESC
    ) OA_teamc
    OUTER APPLY
    (
        SELECT TOP(1)
            TT.namecol2 AS Team3
            , TT.[datetime2] AS DateTime3
        FROM @T AS TT
        WHERE
            TT.teamcol1 = 'teamd'
            AND TT.col1 = CTE_Groups.col1
            AND TT.col2 = CTE_Groups.col2
        ORDER BY TT.[datetime2] DESC
    ) OA_teamd

结果集:

col1     col2    Team1    DateTime1                  Team2    DateTime2                  Team3    DateTime3
12345    2345    bcd      2014-12-02 06:35:38.917    def      2014-12-22 11:57:54.863    efg      2015-01-03 13:28:24.717

如果col1col2的某个组合没有teamb,那么Team1和[=23中会有NULL =]. teamcteamd.

相同