【问题标题】:How to limit results of SQLite per specific group of results?如何限制每个特定结果组的 SQLite 结果?
【发布时间】:2016-09-13 19:03:20
【问题描述】:

我在工作中遇到以下问题。我有一个包含不同列和几 100 000 行的大表。我只会发布我感兴趣的。

假设如下数据集

设备 ID、功能 ID、功能状态

1,        1,        0
1,        2,        0
1,        3,        1
1,        4,        1
1,        5,        1

2,        1,        1
2,        2,        0
2,        3,        0 
2,        4,        1
2,        5,        0

3,        1,        1
3,        2,        1
3,        3,        1
3,        4,        1
3,        5,        1

4,        1,        0
4,        2,        0
4,        3,        1
4,        4,        0
4,        5,        0

我需要选择功能状态 = 1 的行,但只选择每个设备 ID 的前 2 行。

查询的结果应该是:

1,3,1
1,4,1
2,1,1
2,4,1
3,1,1
3,2,1
4,3,1

我尝试过这样的事情:

SELECT brdsurfid,featureidx,FeatStatus FROM Features F1 WHERE FeatStatus = 1 AND
  (SELECT COUNT(*) FROM Features F2 
  WHERE F2.FeatureIdx <= F1.FeatureIdx AND F2.FeatStatus = 1) < 2
  ORDER BY BrdSurfId,FeatureIdx;

我在另一个回复中找到了,但效果不佳。

我知道我需要混合使用 LIMIT 或 COunt(*) 以及一些嵌套选择,但我无法弄清楚。谢谢

【问题讨论】:

  • 为什么是 MySQL 标签?
  • 因为我认为了解 SQL 并使用 MySql 的人可以提供帮助。为什么不?这是一个与数据库相关的问题,即使是特定于 Sqlite,交叉经验也可能有效

标签: mysql sql sqlite select limit-per-group


【解决方案1】:

这可能不是一种非常有效的方法,但我认为 sqlite 没有更好的解决方案(涉及单个查询):

SELECT *
FROM t t0
WHERE FeatureStatus AND
      (SELECT count(*)
       FROM t t1
       WHERE t0.DeviceID=t1.DeviceID
         AND FeatureStatus
         AND t1.FeatureId<t0.FeatureId
      )<2;

我假设该表名为t。这个想法是找到状态为 1 的所有功能,然后为每个功能计算同一产品具有该状态的先前功能。如果该计数大于 2,则拒绝该行。

【讨论】:

  • 让我试试吧!这就是我自己想要做的。
  • 它不起作用。它返回 FeatStatus = 1 的所有行。:(
  • @AlexandruLucianSusma 你确定吗?我只是用您的示例数据再次运行它,它只返回设备 ID 1 的功能 3 和 4(不是 5)。
  • 它工作正常你是对的!我输错了什么!!非常感谢!
【解决方案2】:

不确定这是否适用于 sqlite,但它的价值...

 ;with result as
 (
      SELECT
         brdsurfid,
         featureidx,
         FeatStatus ,
         ROW_NUMBER() OVER(PARTITION BY brdsurfid ORDER BY fieldWhatever) AS 'someName1',
         ROW_NUMBER() OVER(PARTITION BY featureidx ORDER BY fieldWhatever) AS 'someName2',
         ROW_NUMBER() OVER(PARTITION BY FeatStatus ORDER BY fieldWhatever) AS 'someName3'

         FROM
            Features
  )
  SELECT * 
  FROM 
     result
  WHERE 
     FeatStatus = 1 AND
     someName1 <= 2 AND
     someName2 <= 2 AND
     someName3 <= 2 

【讨论】:

    猜你喜欢
    • 2021-06-08
    • 1970-01-01
    • 1970-01-01
    • 2017-10-13
    • 1970-01-01
    • 2019-07-14
    • 2017-10-13
    • 2020-02-27
    • 2011-01-01
    相关资源
    最近更新 更多