sql中是否有能够有效执行此操作的功能?
形象地说,我有一个包含三列的数据库:tape_date
,empl
和一个字符列val
;我想按照val
的顺序,为每个empl
连接起来,提取tape_date
的最新3个值。例如,对于下表,我应该得到一行
bob, DEA
和其他empl
类似。订单很重要,例如EDA
bob
会导致错误的结果。
我正在使用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
答案 0 :(得分:2)
有几种方法可以执行此操作,一种方法是使用Sybase LIST函数,如果您不介意它只在Sybase上运行。如果没有,那么您可以使用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
答案 1 :(得分:0)
通过查询“展平”组返回的行的唯一方法是使用过程语言(T-SQL,C#,Java)。仅在SQL中不可能。