SQL Server:获取年份和月份
我有一个SQL Server表,如下所示: 我想做的是显示最近交易的年份和月份 在本例中,我希望显示SQL Server:获取年份和月份,sql,sql-server,Sql,Sql Server,我有一个SQL Server表,如下所示: 我想做的是显示最近交易的年份和月份 在本例中,我希望显示 ID: 1 Year: 2013 Month: 11 Trades: 2 我尝试使用: select id, MAX(year), MAX(month) from ExampleTable where trades > 0 group by id 我必须连接列吗?您可以使用它根据每行的相对位置(由您的订货人定义)为每行分配一个数字
ID: 1
Year: 2013
Month: 11
Trades: 2
我尝试使用:
select
id, MAX(year), MAX(month)
from
ExampleTable
where
trades > 0
group by
id
我必须连接列吗?您可以使用它根据每行的相对位置(由您的订货人定义)为每行分配一个数字:
根据您的示例数据,这将给出:
ID YEAR MONTH TRADES RowNum
1 2013 11 2 1
1 2013 4 42 2
然后您可以将其限制在RowNum
为1的位置:
SELECT ID, Year, Month, Trades
FROM ( SELECT ID,
Year,
Month,
Trades,
RowNum = ROW_NUMBER() OVER(PARTITION BY ID ORDER BY Year DESC, Month DESC)
FROM ExampleTable
WHERE Trades > 0
) AS t
WHERE t.RowNum = 1;
如您的示例所示,如果将年
和月
存储为VARCHAR
,则需要在订购前转换为INT
:
RowNum = ROW_NUMBER() OVER(PARTITION BY ID
ORDER BY
CAST(Year AS INT) DESC,
CAST(Month AS INT) DESC)
如果您只关心ID为1的记录,只需使用TOP
:
SELECT TOP 1 ID, Year, Month, Trades
FROM ExampleTable
WHERE ID = 1
AND Trades > 0
ORDER BY CAST(Year AS INT) DESC, CAST(MONTH AS INT) DESC;
您可以使用根据每一行的相对位置(由您的订货人定义)为每一行分配一个编号:
根据您的示例数据,这将给出:
ID YEAR MONTH TRADES RowNum
1 2013 11 2 1
1 2013 4 42 2
然后您可以将其限制在RowNum
为1的位置:
SELECT ID, Year, Month, Trades
FROM ( SELECT ID,
Year,
Month,
Trades,
RowNum = ROW_NUMBER() OVER(PARTITION BY ID ORDER BY Year DESC, Month DESC)
FROM ExampleTable
WHERE Trades > 0
) AS t
WHERE t.RowNum = 1;
如您的示例所示,如果将年
和月
存储为VARCHAR
,则需要在订购前转换为INT
:
RowNum = ROW_NUMBER() OVER(PARTITION BY ID
ORDER BY
CAST(Year AS INT) DESC,
CAST(Month AS INT) DESC)
如果您只关心ID为1的记录,只需使用TOP
:
SELECT TOP 1 ID, Year, Month, Trades
FROM ExampleTable
WHERE ID = 1
AND Trades > 0
ORDER BY CAST(Year AS INT) DESC, CAST(MONTH AS INT) DESC;
为什么将“年”和“月”存储为单独的列?在任何情况下,基本逻辑都是将这两个值结合起来,得到最新的值。这很尴尬,因为您将数字存储为字符串,并且月份不是零填充的。但这并不难:
select id,
max(year + right('00' + month, 2))
from ExampleTable
group by id;
要将它们分开:
select id,
left(max(year + right('00' + month, 2)), 4) as year,
right(max(year + right('00' + month, 2)), 2) as month
from ExampleTable
group by id;
这是一个SQL小提琴。请注意,使用SQL FIDLE时,应将数据库设置为正确的数据库。为什么要将“年”和“月”存储为单独的列?在任何情况下,基本逻辑都是将这两个值结合起来,得到最新的值。这很尴尬,因为您将数字存储为字符串,并且月份不是零填充的。但这并不难:
select id,
max(year + right('00' + month, 2))
from ExampleTable
group by id;
要将它们分开:
select id,
left(max(year + right('00' + month, 2)), 4) as year,
right(max(year + right('00' + month, 2)), 2) as month
from ExampleTable
group by id;
这是一个SQL小提琴。请注意,当您使用SQL FIDLE时,您应该将数据库设置为正确的数据库。我不确定是否正确回答了您的问题,但下面的操作是否可行
SELECT TOP 1 year + '-' + month AS Last, trades
FROM ExampleTable
WHERE CAST(trades AS INTEGER) > 0
ORDER BY CAST(year AS integer) DESC, CAST(month AS integer) DESC
我不确定我是否正确回答了你的问题,但下面的问题行得通吗
SELECT TOP 1 year + '-' + month AS Last, trades
FROM ExampleTable
WHERE CAST(trades AS INTEGER) > 0
ORDER BY CAST(year AS integer) DESC, CAST(month AS integer) DESC
试试这个
SELECT TOP 1 ID, [year], trades,
MAX(Convert(INT,[month])) OVER(PARTITION BY [year]) AS [Month]
FROM ExampleTable
WHERE trades > 0
试试这个
SELECT TOP 1 ID, [year], trades,
MAX(Convert(INT,[month])) OVER(PARTITION BY [year]) AS [Month]
FROM ExampleTable
WHERE trades > 0
这个问题不是很清楚,你能再解释一下吗?是的,有点模糊。假设我想跟踪ID为1的客户的交易。我想看看他上一次至少做了1笔交易的年份和月份。问题不是很清楚,你能解释更多吗?是的,有点模糊。假设我想跟踪ID为1的客户的交易。我想看看他上一次至少做了1笔交易的年份和月份。谢谢Gareth,这正是我想要的。谢谢Gareth,这正是我想要的。