1

我希望查询返回结果的顺序有点由内而外。我有一张客户订单表,我想检索 N 个最旧的订单来处理,但这样做是为了最大限度地增加正在处理的不同客户的数量。我将其描述为“反排序”,因为排序顺序使得通常彼此相邻的事物尽可能地展开。

CREATE TABLE custorders (
  order_id integer PRIMARY KEY,
  customer,
  data
);

INSERT INTO custorders VALUES 
  (1,'joe','xyz'),
  (2,'joe','abc'),
  (3,'joe','def'),
  (4,'sam','qwe'),
  (5,'sam','rty');

我可以通过以下方式为每个客户获取最旧的订单

SELECT * 
FROM custorders
WHERE order_id IN 
(
 SELECT MIN(order_id) FROM custorders GROUP BY customer
);

但是我一直试图为每个客户获取 2 个最旧的订单,或者(我真正想要的)所有客户的 10 个最旧的订单,以最大限度地增加不同客户的数量。也就是说,如果有 20 个客户,它将给出 10 个不同的客户,但如果只有 8 个不同的客户都有多个挂单,那么结果中会出现 2 个客户多次。

我在 sqlite 3 中工作,因此使用特定于其他数据库的函数的解决方案没有帮助。

4

4 回答 4

0

SQLlite 似乎不支持 TOP 关键字。按客户分组的子查询中的限制 10 可能会给您 10 个客户,而不是每个客户的前 10 个。

自己实施顶...

我在这里调整了一个 mysql 解决方案,所以任何有 sqllite 经验的人想要清理它,请随意。像下面这样的东西应该可以工作。

我们需要映射 order_id 以便我们有每个客户的连续值。我们想分配由我们的客户自动订购的 rowid,然后是他的 order_id 以升序排列,所以我们首先获得最旧的。rowid 是一个隐藏字段,如果我们不使用主键,它将为我们分配。

CREATE TEMP TABLE temp(
  order_id INTEGER,
  customer text,
  data text
) AS SELECT * FROM custorders ORDER BY customer, order_id ASC;

现在我们有 rowid 来确定每个客户的前 10 个是什么

SELECT t1.* FROM temp AS t1 JOIN (
  SELECT customer, MIN(rowid) AS min FROM temp GROUP BY customer
) AS t2 ON t2.min + 10 < t1.rowid AND t2.customer = t1.customer;
于 2013-10-04T18:30:53.017 回答
0

你不能。SQL 不能做到这一点。

一般来说,SQL 无法跨行比较数据,只能在行内比较。

您正在尝试跨行(最旧的两个等)整理数据。

您可以尝试诸如此类min(order_id) + 2的技巧(找到min所有记录都大于其他记录的位置min),但它们不可扩展。

对不起。

PS。sqllite可能对此有一些特殊的功能,但我并不熟悉。我的回答一般是针对 SQL 的。

于 2012-08-01T23:30:02.580 回答
0

尝试这样的事情。不过我还没有测试过。逻辑是只选择 2 个 order_id 值较低的记录,其中 MIN() 只会返回一个值。

 SELECT * FROM custorders
    WHERE order_id IN 
    (
    SELECT order_id FROM custorders GROUP BY customer
    ORDER BY order_id ASC
    LIMIT 2
    )
    ;
于 2012-08-01T23:34:54.577 回答
0

前言:这是未经测试的(对不起,这台笔记本电脑没有用 sqlfiddle 玩球)但我认为这可能对你有用:

select 
    out.customer,
    group_concat(
        select 
            a.order_id 
        from 
            custOrders a 
        where 
            a.customer=out.customer 
        order by 
            order_id asc 
        limit 2
    ) as outStanding
from
    custOrders out
limit 10
于 2012-08-02T00:09:40.253 回答