Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.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/9/loops/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 server SQL语句中的唯一vs MAX_Sql Server - Fatal编程技术网

Sql server SQL语句中的唯一vs MAX

Sql server SQL语句中的唯一vs MAX,sql-server,Sql Server,我有一个有三列的表: PERSON VISITOR DATE 该表基本上是一个事务表。以下是事实: 每人有多行 每个访问者有多行 给定的人员/访客组合有多行 假定唯一的人员/日期组合 我需要的是 我希望每个人的最大日期的访客 输出中不能有多个人 人必须是独一无二的 参观者可以重复 我试过: SELECT ROW_NUMBER() OVER (PARTITION BY PERSON, VISITOR ORDER BY Date DESC) row_num, PERSON,

我有一个有三列的表:

PERSON 
VISITOR
DATE
该表基本上是一个事务表。以下是事实:

  • 每人有多行
  • 每个访问者有多行
  • 给定的人员/访客组合有多行
  • 假定唯一的人员/日期组合
  • 我需要的是

    • 我希望每个人的最大日期的访客
    • 输出中不能有多个人
    • 人必须是独一无二的
    • 参观者可以重复
    我试过:

    SELECT
        ROW_NUMBER() OVER (PARTITION BY PERSON, VISITOR ORDER BY Date DESC) row_num,
        PERSON,
        VISITOR as VISITOR
    FROM 
        `TABLE`
    ORDER BY 
        PERSON
    

    也许这个。。。我不确定我是否完全理解这个问题。样本数据/预期结果将有所帮助

    您说过您只希望每个最大日期有1名访客,因此行数1将是记录w/最大日期。因为我们是按人划分的,所以如果一个人有3个访客,这并不重要。仅列出此人及其最近的访客

    WITH cte as (
    SELECT ROW_NUMBER() OVER (PARTITION BY PERSON ORDER BY Date DESC) row_num
         , PERSON
         , VISITOR as VISITOR
    FROM `TABLE`)
    
    SELECT * 
    FROM cte 
    WHERE row_Num = 1
    
    我认为这也可以通过交叉应用来实现,尽管我还不太擅长使用它们

    SELECT A.Person, A.Visitor, A.Date 
    FROM table A
    CROSS APPLY (SELECT TOP 1 * 
                 FROM TABLE B
                 WHERE A.Person = B.Person 
                   and A.Visitor = B.Visitor
                   and A.Date = B.Date
                 ORDER BY DATE DESC) C
    

    本质上,内部查询为外部查询上的每个记录运行;因此,将只返回最上面的记录,从而返回最新的日期。

    也许这。。。我不确定我是否完全理解这个问题。样本数据/预期结果将有所帮助

    您说过您只希望每个最大日期有1名访客,因此行数1将是记录w/最大日期。因为我们是按人划分的,所以如果一个人有3个访客,这并不重要。仅列出此人及其最近的访客

    WITH cte as (
    SELECT ROW_NUMBER() OVER (PARTITION BY PERSON ORDER BY Date DESC) row_num
         , PERSON
         , VISITOR as VISITOR
    FROM `TABLE`)
    
    SELECT * 
    FROM cte 
    WHERE row_Num = 1
    
    我认为这也可以通过交叉应用来实现,尽管我还不太擅长使用它们

    SELECT A.Person, A.Visitor, A.Date 
    FROM table A
    CROSS APPLY (SELECT TOP 1 * 
                 FROM TABLE B
                 WHERE A.Person = B.Person 
                   and A.Visitor = B.Visitor
                   and A.Date = B.Date
                 ORDER BY DATE DESC) C
    

    本质上,内部查询为外部查询上的每个记录运行;因此,只返回最上面的记录,即最新的日期。

    我的英语读写能力较弱。 我认为答案可能是:

    SELECT `PERSON`, `VISITOR`, MAX(`DATE`) AS `DATE`
    FROM `TABLE`
    GROUP BY `PERSON`, `VISITOR`;
    

    我的英语读写能力很弱。 我认为答案可能是:

    SELECT `PERSON`, `VISITOR`, MAX(`DATE`) AS `DATE`
    FROM `TABLE`
    GROUP BY `PERSON`, `VISITOR`;
    

    谢谢XQbert。它回答了我的问题,给了我一些其他的东西来学习。非常感谢,谢谢。它回答了我的问题,给了我一些其他的东西来学习。非常感谢。我不认为你想同时按人和访客分组,人是唯一的,意味着每人一行。我不认为你想同时按人和访客分组,人是唯一的,意味着每人一行。