如何在SQL中选择与另一个表中的另一个值对应的每个值
这个标题听起来可能有点让人困惑,但本质上我想做的是从下表中提取出来。我用来创建下表的查询是如何在SQL中选择与另一个表中的另一个值对应的每个值,sql,join,select,group-by,partitioning,Sql,Join,Select,Group By,Partitioning,这个标题听起来可能有点让人困惑,但本质上我想做的是从下表中提取出来。我用来创建下表的查询是 select d.FOLDER_ID, d.PKG_ID, p.file_id, d.PKG_START_TIME, d.PKG_END_TIME, d.ISVALID, d.VALIDFILE_COUNT, d.INVALIDFILE_COUNT, d.ISLOADED, d.LOADEDFILE_COUNT, d.REJECTEDFILE_COUNT from DATA_EXCHANGE_
select d.FOLDER_ID, d.PKG_ID, p.file_id, d.PKG_START_TIME, d.PKG_END_TIME, d.ISVALID, d.VALIDFILE_COUNT, d.INVALIDFILE_COUNT, d.ISLOADED, d.LOADEDFILE_COUNT, d.REJECTEDFILE_COUNT
from DATA_EXCHANGE_PACKAGE d full outer join PACKAGE_FILE p on d.PKG_ID = p.PKG_ID
where d.pkg_id = p.pkg_id
order by PKG_START_TIME asc
此表包含来自两个不同表的数据,如查询中所示,它根据包开始时间选择第一个记录
我试图实现的是,我想要一个查询,可以选择返回的pkg_id的数量,但我想要为选择的pkg_id数量选择的每个文件。例如,在我的数据库中,我可能有100个包,但我只想为前10个包选择每个文件Id。我该怎么做呢。我只能使用top选择前5条记录,并仅选择5个不同的pkg_id行,但不能为那些不同的5个pkg_id选择每个文件id。任何帮助都将不胜感激。我知道分组和分区可以实现我想要的,但我一直没有成功。我不是最擅长SQL的,所以这就是为什么我在挣扎,我认为这个查询会更容易创建。我也肯定where语句是没有意义的,但我还是保留了它
另外,我们假设文件夹\u Id始终为1
+-----------+--------+---------+-------------------------+-------------------------+---------+-----------------+-------------------+----------+------------------+--------------------+
| FOLDER_ID | PKG_ID | file_id | PKG_START_TIME | PKG_END_TIME | ISVALID | VALIDFILE_COUNT | INVALIDFILE_COUNT | ISLOADED | LOADEDFILE_COUNT | REJECTEDFILE_COUNT |
+-----------+--------+---------+-------------------------+-------------------------+---------+-----------------+-------------------+----------+------------------+--------------------+
| 1 | 1 | 1 | 2019-11-19 14:59:24.343 | NULL | NULL | NULL | NULL | NULL | NULL | NULL |
| 1 | 2 | 2 | 2019-11-19 15:10:20.157 | NULL | 1 | 10 | 0 | NULL | NULL | NULL |
| 1 | 2 | 3 | 2019-11-19 15:10:20.157 | NULL | 1 | 10 | 0 | NULL | NULL | NULL |
| 1 | 2 | 4 | 2019-11-19 15:10:20.157 | NULL | 1 | 10 | 0 | NULL | NULL | NULL |
| 1 | 2 | 5 | 2019-11-19 15:10:20.157 | NULL | 1 | 10 | 0 | NULL | NULL | NULL |
| 1 | 2 | 6 | 2019-11-19 15:10:20.157 | NULL | 1 | 10 | 0 | NULL | NULL | NULL |
| 1 | 2 | 7 | 2019-11-19 15:10:20.157 | NULL | 1 | 10 | 0 | NULL | NULL | NULL |
| 1 | 2 | 8 | 2019-11-19 15:10:20.157 | NULL | 1 | 10 | 0 | NULL | NULL | NULL |
| 1 | 2 | 9 | 2019-11-19 15:10:20.157 | NULL | 1 | 10 | 0 | NULL | NULL | NULL |
| 1 | 2 | 10 | 2019-11-19 15:10:20.157 | NULL | 1 | 10 | 0 | NULL | NULL | NULL |
| 1 | 2 | 11 | 2019-11-19 15:10:20.157 | NULL | 1 | 10 | 0 | NULL | NULL | NULL |
| 1 | 3 | 12 | 2019-11-19 15:58:26.733 | NULL | 1 | 10 | 0 | NULL | NULL | NULL |
| 1 | 3 | 13 | 2019-11-19 15:58:26.733 | NULL | 1 | 10 | 0 | NULL | NULL | NULL |
| 1 | 3 | 14 | 2019-11-19 15:58:26.733 | NULL | 1 | 10 | 0 | NULL | NULL | NULL |
| 1 | 3 | 15 | 2019-11-19 15:58:26.733 | NULL | 1 | 10 | 0 | NULL | NULL | NULL |
| 1 | 3 | 16 | 2019-11-19 15:58:26.733 | NULL | 1 | 10 | 0 | NULL | NULL | NULL |
| 1 | 3 | 17 | 2019-11-19 15:58:26.733 | NULL | 1 | 10 | 0 | NULL | NULL | NULL |
| 1 | 3 | 18 | 2019-11-19 15:58:26.733 | NULL | 1 | 10 | 0 | NULL | NULL | NULL |
| 1 | 3 | 19 | 2019-11-19 15:58:26.733 | NULL | 1 | 10 | 0 | NULL | NULL | NULL |
| 1 | 3 | 20 | 2019-11-19 15:58:26.733 | NULL | 1 | 10 | 0 | NULL | NULL | NULL |
| 1 | 3 | 21 | 2019-11-19 15:58:26.733 | NULL | 1 | 10 | 0 | NULL | NULL | NULL |
我想用上述数据实现的一个例子是,我只想根据pkg_开始时间以升序选择前两个不同的pkg_id。但是,当只选择这两个不同的pkg_id时,我希望输出这些pkg_id的每个文件的id。下表是我希望查询从上表中选择的内容
+-----------+--------+---------+-------------------------+--------------+---------+-----------------+-------------------+----------+------------------+--------------------+--------+
| FOLDER_ID | PKG_ID | file_id | PKG_START_TIME | PKG_END_TIME | ISVALID | VALIDFILE_COUNT | INVALIDFILE_COUNT | ISLOADED | LOADEDFILE_COUNT | REJECTEDFILE_COUNT | seqnum |
+-----------+--------+---------+-------------------------+--------------+---------+-----------------+-------------------+----------+------------------+--------------------+--------+
| 1 | 1 | 1 | 2019-11-19 14:59:24.343 | NULL | NULL | NULL | NULL | NULL | NULL | NULL | 1 |
| 1 | 2 | 2 | 2019-11-19 15:10:20.157 | NULL | 1 | 10 | 0 | NULL | NULL | NULL | 1 |
| 1 | 2 | 3 | 2019-11-19 15:10:20.157 | NULL | 1 | 10 | 0 | NULL | NULL | NULL | 2 |
| 1 | 2 | 4 | 2019-11-19 15:10:20.157 | NULL | 1 | 10 | 0 | NULL | NULL | NULL | 3 |
| 1 | 2 | 5 | 2019-11-19 15:10:20.157 | NULL | 1 | 10 | 0 | NULL | NULL | NULL | 4 |
| 1 | 2 | 6 | 2019-11-19 15:10:20.157 | NULL | 1 | 10 | 0 | NULL | NULL | NULL | 5 |
| 1 | 2 | 7 | 2019-11-19 15:10:20.157 | NULL | 1 | 10 | 0 | NULL | NULL | NULL | 6 |
| 1 | 2 | 8 | 2019-11-19 15:10:20.157 | NULL | 1 | 10 | 0 | NULL | NULL | NULL | 7 |
| 1 | 2 | 9 | 2019-11-19 15:10:20.157 | NULL | 1 | 10 | 0 | NULL | NULL | NULL | 8 |
| 1 | 2 | 10 | 2019-11-19 15:10:20.157 | NULL | 1 | 10 | 0 | NULL | NULL | NULL | 9 |
| 1 | 2 | 11 | 2019-11-19 15:10:20.157 | NULL | 1 | 10 | 0 | NULL | NULL | NULL | 10 |
+-----------+--------+---------+-------------------------+--------------+---------+-----------------+-------------------+----------+------------------+--------------------+--------+
编辑:我已经解决了我的问题我不知道为什么要使用完全联接,所以我将用内部联接替换它。您需要行号:
我已经解决了我要问的问题。下面是我提出的问题,它解决了我的问题
select d.FOLDER_ID, d.PKG_ID, p.file_id, d.PKG_START_TIME, d.PKG_END_TIME, d.ISVALID, d.VALIDFILE_COUNT, d.INVALIDFILE_COUNT, d.ISLOADED, d.LOADEDFILE_COUNT, d.REJECTEDFILE_COUNT
from DATA_EXCHANGE_PACKAGE d full outer join PACKAGE_FILE p on d.PKG_ID = p.PKG_ID
where d.PKG_ID = p.PKG_ID and d.PKG_ID > (select max(d.PKG_ID) - 5 from DATA_EXCHANGE_PACKAGE d ) and d.FOLDER_ID = 1
order by PKG_START_TIME desc
这个查询基本上会遍历表并选择每个记录,直到选择了5个不同的pkg_id。我将在Python中使用此查询,并将该5值设置为参数,以便用户可以选择要返回的包的数量。我也可以不使用maxd.PKG_Id。在这个表中,每个新的包Id的值都将高于以前的包Id,因此我可能也可以使用datetime和max,但现在这个查询已经足够好了。文件夹ID值也将是一个参数。您所说的按什么顺序选择打包ID记录的数量是什么意思?随机?我希望顺序是下降的。我刚刚意识到我的问题措辞不当,很抱歉我的措辞不当,我将编辑我的原始问题以修复混乱。我想写的是,我只想选择不同的pkg_id,但我想为这些不同的pkg_id选择每个文件的id。所以如果我只想选择前两个pkg_id的话。然后,应该选择这两个pkg_id的每个文件id。我仍然支持你的答案,因为混淆是我的错,对不起。@CanadianBeaver这不是1对多关系查询的工作方式,如果你想要每个包的每个文件id,那么会有重复的pkg id。你的问题仍然不清楚。我同意重复pkg_id。例如,在上面的下表中,如果我只想为前两个不同的pkg_id选择每个文件的id,那么我希望我的查询能够做到这一点。或者,如果我想为前5个不同的包选择每个文件id,那么我也愿意这样做。我将在原始图表下方制作另一个图表,显示我希望查询执行的操作。
select d.FOLDER_ID, d.PKG_ID, p.file_id, d.PKG_START_TIME, d.PKG_END_TIME, d.ISVALID, d.VALIDFILE_COUNT, d.INVALIDFILE_COUNT, d.ISLOADED, d.LOADEDFILE_COUNT, d.REJECTEDFILE_COUNT
from DATA_EXCHANGE_PACKAGE d full outer join PACKAGE_FILE p on d.PKG_ID = p.PKG_ID
where d.PKG_ID = p.PKG_ID and d.PKG_ID > (select max(d.PKG_ID) - 5 from DATA_EXCHANGE_PACKAGE d ) and d.FOLDER_ID = 1
order by PKG_START_TIME desc