如何获得一个人的详细资料,他在一天的收入大于或等于他们在前一天的收入

daupos2t  于 2021-06-17  发布在  Mysql
关注(0)|答案(4)|浏览(238)

表:信息

样本输出:

这是一个大学练习。我刚刚开始学习sql,不明白如何从列的两个不同行中选择数据,并在示例输出中创建不同的列。我的尝试是完全无用的,所以我不把它放在这里,因为我只知道如何选择单独的列。
先谢谢你

pw136qt2

pw136qt21#

您可以执行info表与自身的左联接。像这样的:

SELECT B.PERSON, B.DAY, B.EARNING, A.DAY PREVIOUS_DAY, A.EARNING PREVDAYEARNING
FROM INFO A
LEFT JOIN INFO B ON A.PERSON=B.PERSON AND B.DAY=A.DAY + 1 AND B.EARNING>=A.EARNING
WHERE B.EARNING IS NOT NULL
uurv41yg

uurv41yg2#

你可以用 Lag() 这里也是mysql和SQLServer都支持的。 LAG() 是一个创建记录块的“窗口函数”( PARTITION BY )对于不同的值(这里我们使用 person ). 它还对那些块/窗口/分区中的记录进行排序,并允许您对它们运行逻辑。 LAG() 在有序分区内选取上一条记录的值。在这种情况下,它得到前一天的 earning 对于每个记录的 person .

SELECT person, 
    earning as current_day_earning, 
    LAG(earning) OVER (PARTITION BY person ORDER BY day) as previous_day_earning 
FROM info;

将其放入子查询和筛选器中:

SELECT *
FROM
    (
        SELECT person, 
            earning as current_day_earning, 
            LAG(earning) OVER (PARTITION BY person ORDER BY day) as previous_day_earning 
        FROM info;
     ) curr_and_prev
 WHERE current_day_earning > previous_day_earning
falq053o

falq053o3#

给你,兄弟

create table #temp_Data
( person varchar(1) null
, earning int null
,day int null
)

insert into #temp_Data values
('A',10,2)
,('A',20,3)
,('B',20,1)
,('B','5',2)
,('B',10,3)
,('A',30,4)

select * from (
select *
,Row_num = ROW_NUMBER() over(partition by person order by earning desc )
from #temp_Data
) a
where a.Row_num = 1
eyh26e7m

eyh26e7m4#

声明@mytable table(person char,revenuing int,[workday]int)
插入@mytable(person,enwing,workday)值('a',10,2)插入@mytable(person,enwing,workday)值('a',20,3)插入@mytable(person,enwing,workday)值('b',20,1)插入@mytable(person,enwing,workday)值('a',30,4)插入@mytable(person,enwing,workday)值('b',5,2)插入@mytable(person,revenuing,workday)值('b',10,3)
选择a.个人,a.工作日作为工作日,a.收入作为前一天,b.工作日作为工作日,b.收入作为收入
从@mytable a在a.person=b.person和a.[workday]+1=b.[workday]上加入@mytable b
其中b.收入>=a.收入

相关问题