C# 月报-SQL
我有下表,如何在SQL中选择每个类别ID中每个月的最后日期(从列表中) 我想以一句话结束: 类别ID |当前|日期C# 月报-SQL,c#,sql,tsql,C#,Sql,Tsql,我有下表,如何在SQL中选择每个类别ID中每个月的最后日期(从列表中) 我想以一句话结束: 类别ID |当前|日期 1 | 5 | 2016-09-30 1 | 3 | 2016-10-30 1 | 7 | 2016-11-30 1 | 2 | 2016-12-30 随着历史的积累 图片: 试试这个: WITH Temp As ( select CategoryId, [Current], RecordAd
1 | 5 | 2016-09-30
1 | 3 | 2016-10-30
1 | 7 | 2016-11-30
1 | 2 | 2016-12-30
随着历史的积累
图片:
试试这个:
WITH Temp As
(
select CategoryId, [Current], RecordAdded,
Dense_Rank() over( partition by CategoryId order by RecordAdded desc) as CatergoryWiseRank
from tblCategory
)
select CategoryId, [Current], RecordAdded from Temp where CatergoryWiseRank=1
考虑到您使用的是
MySQL
,因为您没有提到
假设这是名为:'Dummy'
cat_id current date
------ ------- --------
1 5 2016-09-30
1 3 2016-10-30
1 7 2016-11-30
1 2 2016-12-30
2 4 2016-10-31
2 6 2016-10-04
执行此查询:
select
o.cat_id,
(SELECT DISTINCT
a.date
from
Dummy a
where a.cat_id = o.cat_id
ORDER BY date DESC
LIMIT 1) as 'date'
from
Dummy o
group by o.cat_id ;
为您提供每个类别的最新日期:
cat_id date
------ ------------
1 2016-12-30
2 2016-10-31
编辑
这是专门为你的桌子设计的。只需将“yourTable”替换为表的实际名称即可
select
o.CategoryID,
o.StockCurrent
(SELECT DISTINCT
a.RecordAdded
from
yourTable a
where a.CategoryID = o.CategoryID
ORDER BY RecordAdded DESC
LIMIT 1) as 'RecordAdded'
from
yourTable o
group by o.CategoryID ;
编辑2:
此查询返回特定类别内每个月的最新日期。希望这是你想要的
SELECT
o.CategoryID,
o.StockCurrent,
o.RecordAdded
FROM
`yourTable` o
WHERE o.RecordAdded IN
(SELECT
MAX(i.RecordAdded)
FROM
`yourTable` i
GROUP BY MONTH(i.RecordAdded))
GROUP BY o.CategoryID,
o.RecordAdded ;
假设该表包含以下示例数据:
CategoryID StockCurrent RecordAdded
---------- ------------ -------------
1 5 2016-09-01
1 3 2016-09-02
1 7 2016-10-01
1 2 2016-10-02
2 4 2016-09-01
2 6 2016-09-02
2 66 2016-10-01
2 77 2016-10-02
运行此查询将返回以下结果集:
CategoryID StockCurrent RecordAdded
---------- ------------ -------------
1 3 2016-09-02
1 2 2016-10-02
2 6 2016-09-02
2 77 2016-10-02
有几种方法可以做到这一点,其中之一就是使用窗口函数rownumber。在CTE(WITH)中,您可以在date内获得记录的本地顺序(使用covert来消除此处的时间)+CategoryID分区by datetime DESC(->first是latest)。您需要这样做,因为您不能在WHERE子句中使用窗口函数。然后,在主查询中,实际使用这个CTE作为源表,并且只获取每个分区的最新记录
WITH LocallyOrdered AS (
SELECT CategoryID,
StockCurrent,
ROW_NUMBER() OVER (
PARTITION BY CategoryID, CONVERT(date, RecordAdded)
ORDER BY RecordAdded DESC)
AS RowNumberOneIsLatest
FROM OriginalTable)
SELECT CategoryID, StockCurrent FROM LocallyOrdered WHERE RowNumberOneIsLatest = 1
结果
我不认为这些日期是月份的最后日期。您使用的是哪种数据库管理系统?(许多产品在日期/时间方面远远不符合ANSI SQL。)@GordonLinoff日期是每周五记录的,因此不一定是日历上的一个月的最后一天。例如,我制作日期以显示我想要的最终结果。@ExpressDude:DBMS代表数据库管理系统。简而言之,您使用什么数据库?通常,你会说像MySQL、Microsoft SQL Server(T-SQL是语言)、PostgreSQL,甚至MongoDB……UI看起来像SQL Management Studio,所以我在T-SQL上的钱很抱歉,它返回的结果与选择所有内容相同。你想为每个类别ID(按类别分组)返回一行吗?在哪个DBMS之间?如果你只需要类别id 1,也可以添加where子句,我可以这样做。每月工作4周,每个类别每月有4条记录。我想要一张每个类别每个月的最后一张唱片的列表。在12个月的时间里,每个类别ID将有12条记录。我需要每个类别每个月的最后一个“记录添加”日期。@ExpressDude现在检查编辑2,如果有帮助,请告诉我
SELECT
CASE MONTH(date_field)
WHEN 1 THEN 'Enero'
WHEN 2 THEN 'Febrero'
WHEN 3 THEN 'Marzo'
WHEN 4 THEN 'Abril'
WHEN 5 THEN 'Mayo'
WHEN 6 THEN 'Junio'
WHEN 7 THEN 'Julio'
WHEN 8 THEN 'Agosto'
WHEN 9 THEN 'Septiembre'
WHEN 10 THEN 'Octubre'
WHEN 11 THEN 'Noviembre'
WHEN 12 THEN 'Diciembre'
END as Mes, COUNT(date_field) as cantidad FROM nacimientos
WHERE YEAR(date_field)='1991'
GROUP BY MONTH(date_field)asc