如何使用"返回前2条记录,其中id为"

时间:2017-11-03 10:43:57

标签: sql sqlite

所以我的情况是我有一个" Calls"和相应的"图像"由列#34; CallId"。

链接

所以我有3个电话:

  • 致电,Id 1
    • 图片1
    • 图片2
    • 图片3
    • 图片4
  • 致电,Id 2
    • 图片5
  • 致电,Id 3
    • 图片6

所以目前我可以使用Sql Where Id In来获取这3个调用的所有图像:

Select * from [Images] Where CallId in (1,2,3)

现在返回3次调用的所有Images,但在我的应用中,我只显示top 2因此每次调用只能返回2张图片

我试过了:

Select * from [Images] Where CallId in (1,2,3) Limit 2

但是这只能返回2张图片我最多要找6张图片?

E.g。 使用我的示例我想运行一些将返回的SQL

  • 图片1
  • 图片2
  • 图片5
  • 图片6

2 个答案:

答案 0 :(得分:1)

您可以使用Row_Number功能。以下查询将返回每次调用的前2个图像(假设有一个Colum Called ImgId - 将其更改为您要订购的任何列

SELECT
  *
  FROM 
  (
SELECT
  SeqNo = (SELECT COUNT(1) FROM [Images] WHERE CallId = i.CallId and ImgId >= I.ImgId ),
  *
  FROM [Images] i
)q
  WHERE SeqNo <3

如果您需要任何其他计数,那么只需将Where条件更改为您希望的任何数字。您还可以在其中使用变量,以使其更具动态性和通用性

答案 1 :(得分:1)

由于sqlite中没有窗口函数,因此您需要使用自联接。此解决方案假定每个图像都有一个唯一的id,并根据datetaken属性对其进行排序(正如您在评论中提到的那样)

select t.callid, t.id
from 
(
  select i1.callid, i1.id, count(*) row_count
  from image i1
  join image i2 on i1.CallId = i2.CallId and 
                   i1.datetaken <= i2.datetaken and
                   i1.callid in (1,2,3)
  group by i1.callid, i1.id
) t
where t.row_count <= 2

上述解决方案找到了每datetakencallid值最高的2张图片。如果您需要最低使用率i1.datetaken >= i2.datetaken。如果您在callid中具有相同datetaken值的图像(此解决方案对应于dense_rank()),则可能会出现此问题。如果这足够,请告诉我。 row_number()的自我加入条件会更复杂。