我有一个具有以下格式的oracle表, 例如:
JLID Dcode SID TDT QTY
8295783 3119255 9842 3/5/2018 14
8269771 3119255 9842 3/6/2018 11
8302211 3119255 1126 3/1/2018 19
这里我对同一个Dcode有不同的SID,现在我需要获得最大数量的SID。 (即)对于SID 9842 - (14 + 11)= 25,对于SID 1126它是19,那么结果应该在SID 9842.所以,我们的查询应该返回以下结果
JLID Dcode START_DT END_DT SID
111 3119255 3/1/2018 3/31/2018 12:00 9842
Startdate和enddate应该从TDT计算(即)开始日期是该月的第一个日期,结束日期是该月的最后一个日期 任何人都可以建议我做一些想法。
答案 0 :(得分:2)
这是一个在最终结果中不包含JLID = 111的选项,因为我不知道你从哪里拿到它。
SQL> with test (jlid, dcode, sid, tdt, qty) as
2 (select 8295783, 3119255, 9842, date '2018-03-05', 14 from dual union
3 select 8269771, 3119255, 9842, date '2018-08-22', 11 from dual union
4 select 8302211, 3119255, 1126, date '2018-03-01', 19 from dual union
5 --
6 select 1234567, 1112223, 1000, date '2018-06-16', 88 from dual
7 )
8 select dcode,
9 min (trunc (tdt, 'mm')) start_dt, --> MIN
10 max (last_day (tdt)) end_dt, --> MAX
11 sid
12 from (select dcode,
13 sid,
14 tdt,
15 sqty,
16 rank () over (partition by dcode order by sqty desc) rnk
17 from (select dcode,
18 sid,
19 tdt,
20 sum (qty) over (partition by dcode, sid) sqty
21 from test))
22 where rnk = 1
23 group by dcode, sid; --> GROUP BY
DCODE START_DT END_DT SID
---------- ---------------- ---------------- ----------
1112223 01.06.2018 00:00 30.06.2018 00:00 1000
3119255 01.03.2018 00:00 31.08.2018 00:00 9842
SQL>
答案 1 :(得分:2)
可能就是这么简单:
SELECT Dcode, start_date, end_date, SID FROM (
SELECT Dcode, SID, TRUNC(start_date, 'MONTH') AS start_date
, LAST_DAY(end_date) AS end_date
, ROW_NUMBER() OVER ( PARTITION BY Dcode ORDER BY total_qty DESC ) AS rn
FROM (
SELECT Dcode, SID, MIN(TDT) AS start_date, MAX(TDT) AS end_date
, SUM(QTY) AS total_qty
FROM mytable
GROUP BY Dcode, SID
)
) WHERE rn = 1
在最内部子查询中,我聚合以获取Dcode
和SID
的特定值的日期范围和总数量。然后我使用anaylitic(窗口)函数来获取总数量最大的行。 (如果您想要返回多个具有相同数量的SID值,您可能希望使用RANK()
代替ROW_NUMBER()
。)