【问题标题】:How to aggregate values from different rows in sql (HANA)?如何聚合 sql (HANA) 中不同行的值?
【发布时间】:2017-12-22 07:46:08
【问题描述】:

我有一个这样定义的发货表(该表存储在 HANA 数据库中,如果相关):

CREATE COLUMN TABLE SHIPMENTS (
    ShipmentID INT PRIMARY KEY,
    Received INT,
    Facility NVARCHAR(10),
    Item NVARCHAR(20)
);

这里,'Received' 列表示收到每批货物的时间点,Facility 是接收货物的地点,Item 是货物的内容。

我已经用这样的数据填充了它:

INSERT INTO SHIPMENTS VALUES (1, 0, 'Factory', 'Production machine');
INSERT INTO SHIPMENTS VALUES (2, 0, 'Office', 'Printer');
INSERT INTO SHIPMENTS VALUES (3, 0, 'Factory', 'Coffee maker');
INSERT INTO SHIPMENTS VALUES (4, 1, 'Office', 'Coffee maker');
INSERT INTO SHIPMENTS VALUES (5, 1, 'Factory', 'Fax Machine');
INSERT INTO SHIPMENTS VALUES (6, 2, 'Office', 'Computers');
INSERT INTO SHIPMENTS VALUES (7, 2, 'Factory', 'Fridge');
INSERT INTO SHIPMENTS VALUES (8, 2, 'Factory', 'Freezer');
INSERT INTO SHIPMENTS VALUES (9, 2, 'Office', 'Fax Machine');

我想查询数据库以查找在每个时间点到该时间点已收到哪些项目。根据另一个线程的回答,我首先这样做:

SELECT Facility, Received, STRING_AGG (Item, ';') as Items
    FROM (
        SELECT * FROM SHIPMENTS 
        ORDER BY Facility, Received
    )
GROUP BY Facility, Received
ORDER BY Facility, Received;

导致

  | FACILITY | RECEIVED | ITEMS
---------------------------------------------------------
1 | Factory  | 0        | Production Machine;Coffee maker
2 | Factory  | 1        | Fax Machine
3 | Factory  | 2        | Fridge;Freezer
4 | Office   | 0        | Printer
5 | Office   | 1        | Coffee maker
6 | Office   | 2        | Computers;Fax Machine

不过,我想要这个

  | FACILITY | RECEIVED | ITEMS
---------------------------------------------------------
1 | Factory  | 0        | Production Machine;Coffee maker
2 | Factory  | 1        | Production Machine;Coffee maker;Fax Machine
3 | Factory  | 2        | Production Machine;Coffee maker;Fax Machine;Fridge;Freezer
4 | Office   | 0        | Printer
5 | Office   | 1        | Printer;Coffee maker
6 | Office   | 2        | Printer;Coffee maker;Computers;Fax Machine

即,每一行显示当时收到的内容,以及已经收到的所有内容。在 SQL 中有没有很好的方法来做到这一点?

【问题讨论】:

  • 您尝试了什么,遇到了什么错误?
  • @NathanielFlick OP 实际上确实显示了他们尝试过的内容,并且没有错误,除了输出不是我们想要的。
  • @TimBiegeleisen “在 SQL 中有没有很好的方法来做到这一点?”在我看来,这个问题是开放式的,未经测试?
  • @NathanielFlick 这根本不是开放式的,OP 给了我们他想要的输出。我在下面尝试了一个查询,完全未经测试,因为我不知道 HANA。我会等待反馈。
  • @TimBiegeleisen 够公平的。

标签: sql hana hana-sql-script


【解决方案1】:

您可以尝试在 select 子句中使用相关查询来生成您想要的 csv 数据:

SELECT
    Facility,
    Received,
    (SELECT STRING_AGG (s2.Item, ';') FROM SHIPMENTS s2
     WHERE s2.Facility = s1.Facility AND s2.Received <= s1.Received
     GROUP BY s2.Facility) AS ITEMS
FROM SHIPMENTS s1
GROUP BY
    Facility,
    Received
ORDER BY
    Facility;

【讨论】:

  • 执行此操作我收到错误消息:correlated subquery cannot have TOP or ORDER BY。只是为了检查,我删除了ORDER BY s2.Received,这给了我以下错误:single-row query returns more than one row。有什么想法吗?
  • @Kazim 尝试在子查询中使用GROUP BY s1.Received,并删除那里的ORDER BY 子句(听起来你已经这样做了)。
  • 这实际上与我在 OP 中所做的尝试完全相同,除了 Facility 没有订购
  • @Kazim 我的最后一次尝试:GROUP BY s2.Facility ...这可能是有道理的,因为我们希望跨收据的每个设施都有一个 CSV 字符串。顺便说一句,我从来没有使用过HANA,所以我无法测试这个答案。
  • 你的逻辑在我看来是合理的,但不幸的是结果与 OP 中的完全一样。
【解决方案2】:

也许最好使用带有 String_Agg 函数的 ORDER BY 子句来确保连接按所需顺序进行

select 
distinct Facility, Received,
(
    select string_agg(s.Item, ';' order by Received, ShipmentID) 
    from Shipments s 
    where 
        s.Facility = t.Facility and
        s.Received <= t.Received
    ) as Items
from Shipments t

【讨论】:

    猜你喜欢
    • 2017-02-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-13
    • 1970-01-01
    • 2021-09-25
    相关资源
    最近更新 更多