Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/69.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:GROUP BY与子查询中的单个组筛选器_Sql_Filter_Group By_Subquery - Fatal编程技术网

SQL:GROUP BY与子查询中的单个组筛选器

SQL:GROUP BY与子查询中的单个组筛选器,sql,filter,group-by,subquery,Sql,Filter,Group By,Subquery,我在下面的查询中交叉连接Persons表中的Person_ID和DateRange中的Date Range。这会为范围内的每个日期提供一个Person_ID WITH DateRange(DateData) AS ( SELECT CONVERT(DATETIME, '02/01/2016') as Date UNION ALL

我在下面的查询中交叉连接Persons表中的Person_ID和DateRange中的Date Range。这会为范围内的每个日期提供一个Person_ID

WITH DateRange(DateData) AS
                    (
                        SELECT CONVERT(DATETIME, '02/01/2016') as Date
                        UNION ALL
                        SELECT DATEADD(d,1,DateData)
                        FROM DateRange
                        WHERE DateData < CONVERT(DATETIME, '04/26/2016')
                    )
SELECT TBL_PERSONS.ID AS PERSON_ID, DateRange.DateData AS [DATE]
       FROM
         TBL_PERSONS
         CROSS JOIN DateRange                                    
         WHERE TBL_PERSONS.STATUS='Active'
现在我要做的是,对于每个Person\u ID,我想从同一Person\u ID的不同表中过滤到max date的行

WITH DateRange(DateData) AS
                    (
                        SELECT CONVERT(DATETIME, '02/01/2016') as Date
                        UNION ALL
                        SELECT DATEADD(d,1,DateData)
                        FROM DateRange
                        WHERE DateData < CONVERT(DATETIME, '02/15/2016')
                    )
SELECT T1.PERSON_ID, T1.[DATE]
FROM 
    (SELECT TBL_PERSONS.ID AS PERSON_ID, DateRange.DateData AS [DATE]
       FROM
         TBL_PERSONS
         CROSS JOIN DateRange                                    
         WHERE TBL_PERSONS.STATUS='Active'
     ) T1
GROUP BY T1.PERSON_ID, T1.[DATE]
HAVING T1.[DATE] <=  (SELECT DATEADD(day, 5, MAX(CAST(event_time_Local AS DATE))) AS [DATE] 
                                    FROM TBL_EVENTS_HISTORY
                                    WHERE PRIMARYID = T1.PERSON_ID
                                    GROUP BY PRIMARYID )
但这仍然给出了所有person_id的所有日期。我尝试使用Where代替have,但没有任何更改。我也试过了,下面可是又一样的结果

WITH DateRange(DateData) AS
                    (
                        SELECT CONVERT(DATETIME, '02/01/2016') as Date
                        UNION ALL
                        SELECT DATEADD(d,1,DateData)
                        FROM DateRange
                        WHERE DateData < CONVERT(DATETIME, '02/15/2016')
                    )
SELECT T1.PERSON_ID, T1.[DATE]
FROM 
    (SELECT TBL_PERSONS.ID AS PERSON_ID, DateRange.DateData AS [DATE]
       FROM
         TBL_PERSONS
         CROSS JOIN DateRange                                    
         WHERE TBL_PERSONS.STATUS='Active'
     ) T1
JOIN 
(SELECT PRIMARYID AS PERSON_ID, DATEADD(day, 5, MAX(CAST(event_time_Local AS DATE))) AS [DATE] 
                                    FROM TBL_EVENTS_HISTORY
                                    GROUP BY PRIMARYID ) T2
ON T1.PERSON_ID = T2.PERSON_ID
AND T1.[DATE] <= T2.[DATE]
我的问题是,我做错什么了吗?或者甚至可以为每个组设置单独的过滤器


注意:我正在尝试构建独立于SQL server或Oracle的查询。

您能发布数据和表结构以及预期结果吗?看起来横向联接在这里很有用。它在SQL标准中,但是不同的DBMS有不同的关键字。例如,在SQL Server中,它被称为交叉/外部应用。如果你提供一些样本数据和预期结果,很可能有人会写一个具体的答案。