Sql 如何基于两列和一个min函数选择此行
我非常感谢为这个问题编写select查询的所有帮助 我的桌子 我们需要找到有效的=1行,其中相同的sw\u id、url\u id的打开日期更少 select query应从上面输出行,如下所示: 查询输出 如您所见,我们只选择打开日期高于最低打开日期的行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
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;