Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/70.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 如何基于两列和一个min函数选择此行_Sql_Db2 - Fatal编程技术网

Sql 如何基于两列和一个min函数选择此行

Sql 如何基于两列和一个min函数选择此行,sql,db2,Sql,Db2,我非常感谢为这个问题编写select查询的所有帮助 我的桌子 我们需要找到有效的=1行,其中相同的sw\u id、url\u id的打开日期更少 select query应从上面输出行,如下所示: 查询输出 如您所见,我们只选择打开日期高于最低打开日期的行 我希望您能从上面的描述中理解这个问题。如果您在这里也展示了自己的努力,那将是一件好事,但基本上,子查询是新手最容易理解的方法之一 SELECT sw_id, url_id, open_date, valid,

我非常感谢为这个问题编写select查询的所有帮助

我的桌子

我们需要找到有效的=1行,其中相同的sw\u id、url\u id的打开日期更少

select query应从上面输出行,如下所示:

查询输出

如您所见,我们只选择打开日期高于最低打开日期的行


我希望您能从上面的描述中理解这个问题。

如果您在这里也展示了自己的努力,那将是一件好事,但基本上,子查询是新手最容易理解的方法之一

SELECT
    sw_id,
    url_id,
    open_date,
    valid,
    (
        SELECT MIN(open_date)
        FROM MyTable t2
        WHERE t2.sw_id = t1.sw_id GROUP BY t2.sw_id
    ) AS min_open_d
FROM
    MyTable t1
WHERE
    valid = 1
ORDER BY
    open_date DESC

您的示例和解释留下了一点解释的余地,但类似的内容应该很接近

SELECT  sw_id ,
        url_id ,
        open_date ,
        valid ,
        ( SELECT    MIN(open_date)
          FROM      mytable mt2
          WHERE     mt2.sw_id = mt1.sw_id
                    AND mt1.url_id = mt2.url_id
          GROUP BY mt2.sw_id, mt2.url_id
        ) AS min_open_d
FROM    mytable mt1
WHERE   valid = 1 AND mt1.open_date >          
        ( SELECT    MIN(open_date)
          FROM      mytable mt3
          WHERE     mt3.sw_id = mt1.sw_id
                    AND mt1.url_id = mt3.url_id
          GROUP BY mt3.sw_id, mt3.url_id
        )

使用OLAP功能可以更优雅地解决此问题:

select * from (
    select sw_id, 
           url_id, 
           open_date, 
           valid, 
           min(open_date) over (partition by sw_id,url_id) as min_open_d
       from MyTable
       where valid = 1
    )
    where open_date <> min_open_d;

这应该比子查询更有效。

您能粘贴到目前为止您尝试过的内容吗?您好,我有两个不同的查询,我不满意。我希望收到新的想法,而不是提出这些问题。但是如果你真的想查看它们,请看这里:分组依据应该基于sw_id和url_id,我认为这也会显示101 sw_id,我希望将那些打开日期不少于101 sw_id的sw和url id从选择中排除。我将很快尝试,我希望排除那些打开日期不少于101 sw_id的行。例如,sw_id 101和第一次出现的202。谢谢你@RThomas
SELECT  sw_id ,
        url_id ,
        open_date ,
        valid ,
        ( SELECT    MIN(open_date)
          FROM      mytable mt2
          WHERE     mt2.sw_id = mt1.sw_id
                    AND mt1.url_id = mt2.url_id
          GROUP BY mt2.sw_id, mt2.url_id
        ) AS min_open_d
FROM    mytable mt1
WHERE   valid = 1 AND mt1.open_date >          
        ( SELECT    MIN(open_date)
          FROM      mytable mt3
          WHERE     mt3.sw_id = mt1.sw_id
                    AND mt1.url_id = mt3.url_id
          GROUP BY mt3.sw_id, mt3.url_id
        )
select * from (
    select sw_id, 
           url_id, 
           open_date, 
           valid, 
           min(open_date) over (partition by sw_id,url_id) as min_open_d
       from MyTable
       where valid = 1
    )
    where open_date <> min_open_d;