2015-10-07 104 views
3

输入如何获得第一和最后一排每列

DATE TRANSACTION TYPE 
may01  22   ATM 
jun18  34   ATM 
Aug14  38   NB 
jul18  46   NB 
Sep11  29   NB 
Dec21  70   NB 
jan02  46   MobileB 
Jun19  20   MobileB 
Sep13  81   MobileB 

HOW TO GET第一个和最后一行每列LIKE

TYPE  Start_DATE End_DATE 
ATM   may01  jun18 
NB   Aug14  Dec21 
MobileB  jan02  Sep13 

在此输出必须得到第一日期和截止日期group by TYPE.PLEASE HELP ME

回答

0

在SQL中,预定义的函数用于根据列名提取第一行和最后一行记录

SELECT FIRST(column_name) FROM table_name; 
SELECT LAST(column_name) FROM table_name; 

在MySQL

SELECT column_name FROM table_name 
ORDER BY column_name ASC 
LIMIT 1; 



SELECT column_name FROM table_name 
    ORDER BY column_name DESC 
    LIMIT 1; 
+0

是这个函数真的在mysql中工作吗?如果是的话,那么在哪个版本的MySQL? –

+0

以上将在SQL中工作。如果你想要MySQL SELECT column_name FROM table_name ORDER BY column_name ASC LIMIT 1; –

+0

好吧,所以请编辑您的帖子相应 –

1

之前大规模检修你的问题,我会建议:

SELECT 'COL1' AS `COL_NAMES`,(SELECT `c1` as `START_ROW` FROM `tbl` WHERE !ISNULL(`c1`) ORDER BY c1 ASC LIMIT 1) AS `ROW_START`,(SELECT `c1` as `END_ROW` FROM `tbl` WHERE !ISNULL(`c1`) ORDER BY c1 DESC LIMIT 1) AS `ROW_END` 
UNION ALL 
SELECT 'COL2' AS `COL_NAMES`,(SELECT `c2` as `START_ROW` FROM `tbl` WHERE !ISNULL(`c2`) ORDER BY c2 ASC LIMIT 1) AS `ROW_START`,(SELECT `c2` as `END_ROW` FROM `tbl` WHERE !ISNULL(`c2`) ORDER BY c2 DESC LIMIT 1) AS `ROW_END` 
UNION ALL 
SELECT 'COL3' AS `COL_NAMES`,(SELECT `c3` as `START_ROW` FROM `tbl` WHERE !ISNULL(`c3`) ORDER BY c3 ASC LIMIT 1) AS `ROW_START`,(SELECT `c3` as `END_ROW` FROM `tbl` WHERE !ISNULL(`c3`) ORDER BY c3 DESC LIMIT 1) AS `ROW_END` 
UNION ALL 
SELECT 'COL4' AS `COL_NAMES`,(SELECT `c4` as `START_ROW` FROM `tbl` WHERE !ISNULL(`c4`) ORDER BY c4 ASC LIMIT 1) AS `ROW_START`,(SELECT `c4` as `END_ROW` FROM `tbl` WHERE !ISNULL(`c4`) ORDER BY c4 DESC LIMIT 1) AS `ROW_END` 

假设如表:

CREATE TABLE IF NOT EXISTS `tbl` (
    `c1` int(11) DEFAULT NULL, 
    `c2` int(11) DEFAULT NULL, 
    `c3` int(11) DEFAULT NULL, 
    `c4` int(11) DEFAULT NULL 
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; 


INSERT INTO `tbl` (`c1`, `c2`, `c3`, `c4`) VALUES 
(1, 30, 89, 34), 
(2, 49, 76, 44), 
(NULL, 52, 90, NULL), 
(NULL, NULL, 16, NULL); 

我不能给你现在正在用你的新数据得到一个确切的答案,但是我的答案在这里会给你带来很大的帮助,你只需要修复一些东西,比如列名,表名。如果您正在测试包含空字符串的第一个和最后一个非NULL值,则我的!ISNULL(...)逻辑正常。如果你正在为空字符串,而不是测试,使用LENGTH(...)=0代替,或者两者都是可能的组合:(!ISNULL(...) AND LENGTH(...)>0)

1

您可以使用GROUP_CONCATSUBSTRING_INDEX得到像下面

select type, 
SUBSTRING_INDEX(GROUP_CONCAT(CAST(date AS CHAR) ORDER BY date), ',', 1) as Start_date, 
SUBSTRING_INDEX(GROUP_CONCAT(CAST(date AS CHAR) ORDER BY date DESC), ',', 1) as End_date 
from test 
group by type; 

第一个和最后一个行点击这里查看SQL Fiddle DEMO

+0

非常感谢.... – suri5913

+1

很高兴我帮助...请接受答案,如果它帮助你,这样它会对其他:) – Crazy2crack

0

下面的代码工作正常,首先我已将日期转换为日期格式 select *,str_to_date(date,“%m /%d /%Y”)as tab3;

选择类型,MIN(DAT)作为SD,MAX(DAT)作为ED从GROUP BY TYPE;

0
select 
* 
from 
(select * from application, (SELECT @rownums:=0) r order by (@rownum := @rownum + 1) asc limit 1) a1 

union 

select 
* 
from 
(select * from application, (SELECT @rownum:=0) r1 order by (@rownum := @rownum + 1) desc limit 1) a2; 
相关问题