gpt4 book ai didi

SQL: group by, order by 和 concat 结果

转载 作者:行者123 更新时间:2023-12-04 14:34:04 25 4
gpt4 key购买 nike

sql 中是否有可以高效执行此操作的功能?

形象地说,我有一个包含三列的数据库:tape_dateempl 和一个字符列val;我想为每个按 tape_date 顺序连接在一起的 empl 提取最近的 3 个 val 值。例如对于下表,我应该得到一行

bob, DEA

对于其他 empl 也是如此。顺序很重要,例如 EDAbob 来说是错误的结果。

我正在使用 Sybase Adaptive Server Enterprise/15.7.0,但不想使用专有功能。

tape_date    empl    val
------------------------
2014-01-08 bob A
2014-01-01 bob G
2014-01-03 alice K
2014-01-02 bob D
2014-01-05 bob E

最佳答案

有几种方法可以做到这一点,如果您不介意它只在 Sybase 上运行,一种是使用 Sybase LIST 函数。如果没有,那么您可以使用 RANK 和 MAX 来完成。像这样:

SELECT 
CAST('2014-01-03' AS DATE) AS tape_date
,'alice' AS empl
,'K' AS val
INTO #temp_table;
INSERT INTO #temp_table VALUES('2014-01-08', 'bob', 'A');
INSERT INTO #temp_table VALUES('2014-01-01', 'bob', 'G');
INSERT INTO #temp_table VALUES('2014-01-02', 'bob', 'D');
INSERT INTO #temp_table VALUES('2014-01-05', 'bob', 'E');


-- USING SYBASE ONLY LIST FUNCTION
SELECT empl, SUBSTR(LIST(val ORDER BY tape_date), 1, 5)
FROM #temp_table
GROUP BY empl;

-- THE GENERIC WAY
SELECT
empl
,MAX(CASE rank WHEN 1 THEN val ELSE '' END)
+ ','
+ MAX(CASE rank WHEN 2 THEN val ELSE '' END)
+ ','
+ MAX(CASE rank WHEN 2 THEN val ELSE '' END)
FROM (
SELECT
RANK() OVER (PARTITION BY empl ORDER BY tape_date) AS rank
,*
FROM #temp_table) a
WHERE rank <= 3
GROUP BY
empl

关于SQL: group by, order by 和 concat 结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19840704/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com